zoukankan      html  css  js  c++  java
  • linux下多进程的调试

    linux下多进程的调试:
     (1)follow-fork-mode
              set follow-fork-mode [parent | child] ———— fork之后选择调试父进程还是子进程
              (parent: fork之后继续调试父进程;child: fork之后调试父进程。默认的是fork之后调试父进程)
              set detach-on-fork [on | off] ———— 指示gdb在fork之后是否断开某个进程的调试,或交由gdb控制
              (on: 断开调试follow-fork-mode指定的进程;off: gdb将控制父进程和子进程,follow-fork-mode指定的进程将被调试,还有一个进程置于暂停状态)
     (2)attach pid (须要先将进程放到后台执行)
        ubuntu下gdb要使用attach pid权限是不够的,须要切换到root,或者你能够sudo chmod +s /usr/bin/gdb给gdb加入权限。
        使用attach须要在父子进程代码最開始加入sleep()语句,让进程睡眠,之后在后台执行进程,通过ps获取子进程pid,最后attach pid进入调试子进程。
        eg:
            $./test &            //使进程test在后台执行
            $ps -ef | grep test        //查看进程pid
             结果中类似以下的形式:
            XXX 12345 23456 ———————————————— ./test        //父进程
            XXX 12346 12345 ———————————————— ./test         //子进程,这里的第一个数字就是子进程pid
            $ gdb -q test
            (gdb)attach 12346 
            //attach到子进程
        加入的sleep()能够是类似这种语句:
            while(pause)        //pause是一个标志变量
                sleep(1);
        在gdb调试时你仅仅须要set pause=0使条件不满足就可以运行兴许代码。
     (3)gdb wrapper
        当父进程fork出子进程,子进程会紧接着调用exec函数来运行新的代码,这时也能够用gdb wrapper。它的长处是不用加入额外代码。

    linux下将一个进程放到后台执行:
      (1)./test &

               结果类似: [1]  4301,1为放到后台的进程编号,4301为进程PID

      (2)"./test" 之后按下 "ctrl+z",命令行下会显示一行,类似以下这样:

                 [1]+  已停止  ./test,

             最前面有一个数字,用"bg %num"(num为返回的数字)将该进程放到后台;

                 会显示类似以下的结果:  [1]+  ./test  &

    linux下将进程拉回前台:

             输入"fg %num",结果直接显示类似: ./test,test为刚才放到后台执行的程序

  • 相关阅读:
    Intellij Idea非常6的10个姿势!
    java 集合
    oracle sql调优
    springboot
    整理的java jdk1.8跟mybatiseplus
    java8中lambda的用法(map转list,list转map等等
    遍历数组中的元素(含es6方法)
    云计算初探
    转FMS小工具用法
    Flex内存消耗
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3966529.html
Copyright © 2011-2022 走看看