精华内容
下载资源
问答
  • gdb进程
    千次阅读
    2022-01-29 10:56:23

    一、非生产环境中可以gdb到一个进程里面,但是有时候停顿太久,gdb附身到这个进程会挂掉,这时候就需要杀死这个gdb进程

    开启另一个终端 root权限执行
    ps -A|grep gdb
    可查出 gdb进程号
    再用
    kill -9 进程号
    可强制停止kill该进程
    

    二、gdb调试程序的时候,有时gdb会因为某些原因crash掉。这时被调试的那个进程往往就成了僵尸进程。这种僵尸进程用killall是杀不掉的,用kill -9或者kill -SIGKILL也是杀不掉的,甚至退出用户登录也杀不掉。很多人这时候只好reboot机器。

    但是可以用kill -18就能杀掉gdb产生的僵尸进程。信号18是SIGCONT,这个信号可以让停在断点上的进程继续运行。

    维基百科上说:
    When SIGSTOP is sent to a process, the usual behaviour is to pause that process in its current state. The process will only resume execution if it is sent the SIGCONT signal. SIGSTOP and SIGCONT are used for job control in the Unix shell, among other purposes. SIGSTOP cannot be caught or ignored.

    • job control意思
      Job control (workplace), the ability of a person to influence what happens in their work environment

    三、gdb的print打印默认打印不全

    使用set print element 0 设置后就能完整显示了

    四、让被gdb调试的程序能够接受信号

    • 法一:
      使用singal命令可以产生一个信号量给被调试的程序。如中断信号Ctrl+C。这非常方便于程序的调试,可以在程序运行的任意位置设置断点,并在该断点用gdb产生一个信号量。精确地在某处产生信号非常有利程序的调试。 其语法是: signal Linux的系统信号量通常从1到15。所以的取值也在这个范围。 signal命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由gdb截获的,而signal命令所发出的信号则是直接发给被调试程序的。

    • 法二:(改变gdb对特定信号的处理)
      handle SIGINT nostop print 告诉gdb在接受到SIGINT时不要停止,并把该信号传递给目标调试程序

    五、函数明明存在,添加断点却无效

    使用结果break 函数名字添加断点,gdb却提示make breakpoint pending on future shared lirary load ? y or n,输入y却没用,添加的断点也不会触发,需要改成
    b 文件:行号 ,这样就能添加同样效果的断点了

    六、断点的类型,这里只介绍条件断点

    断点的类型:普通断点、条件断点、硬件断点(watch)
    条件断点:
    法一:b 文件名:行号 if 条件
    法二:b 文件名:行号
    condition 断点序号 条件

    更多相关内容
  • Linux-gdb进程调试

    千次阅读 2018-04-09 08:59:11
    gdb调试一个进程的过程以下面模拟实现sleep()函数为例#include #include #include void wakeup(int signo) { //do nothing } unsigned int mysleep(unsigned int t) { struct sigaction new,

    gdb调试一个进程的过程

    以下面模拟实现sleep()函数为例

    #include <stdio.h>
    #include <unistd.h>
    #include <signal.h>
    void wakeup(int signo)
    {
          //do nothing
    }
    unsigned int mysleep(unsigned int t)
    {
          struct sigaction new,old;
          sigset_t newmask,oldmask,suspmask;
          unsigned int unsleep=0;
          new.sa_handler=wakeup;
          new.sa_flags=0;
          sigemptyset(&new.sa_mask);
          //注册一个信号处理函数
          sigaction(SIGALRM,&new,&old);
          sigemptyset(&newmask);
          //添加一个信号到newmask阻塞集
          sigaddset(&newmask,SIGALRM);
          //阻塞SIGALRM信号
          sigprocmask(SIG_BLOCK,&newmask,&oldmask);
          //设置一个闹钟
          alarm(t);
    
          suspmask=oldmask;
          sigdelset(&suspmask,SIGALRM);
          //解除信号屏蔽并挂起进程,等待闹钟响起
          sigsuspend(&suspmask);
    
          //清空闹钟
          unsleep=alarm(0);
          //回复默认信号处理动作
          sigaction(SIGALRM,&old,NULL);
          sigprocmask(SIG_SETMASK,&oldmask,NULL);
          return unsleep;
    
    }
    int main(  )
    {
        while( 1)
        {
            mysleep(5);
            printf(  "5s passed...\n");
            printf(  "pid=%d\n",getpid( ));
    
        }
        return 0;
    }
    

    程序编译通过无错误,执行下面命令(黄色部分)

    gdb a.out    开始调试a.out文件
    b 4          在第四行打断点,开始调试
    i b          查看断点
    d            删除断点
    r            让程序跑起来
    n            逐行调试
    p 变量名      打印变量,配合n命令效果会更好
    q           退出调试

    如果是进入函数,需要上s命令

    这里写图片描述
    这里写图片描述

    gdb调试多进程

    以下面程序为例,这个程序是为了测试SIGCHLD信号的测试小程序。子进程退出,发SIGCHLD信号父进程,父进程自己做自己的事情,收到信号就回收子进程

    #include <signal.h>
    #include <stdlib.h>
    void handler(int sig)
    {
          pid_t id;
          while(id=waitpid(-1,NULL,WNOHANG)>0)
          {
    
              printf(  "wait child success:%d\n",id);
    
          }
          printf("  child is quit! %d\n",getpid( ));
    }
    int main(  )
    {
          signal(SIGCHLD,handler);
          pid_t cpid;
          if(  cpid=fork()==0)
          {
                printf("child:%d\n",getpid());
                sleep(10);
                exit(1);
    
          }
          while(1)
          {
                printf(  " father proc is doing some thing!pid:%d\n",getpid());
                sleep(1);
    
          }
          return 0;
    }
    

    首先让程序编译通过,最好打印出各自pid
    如果不打印,用 “ps aux | grep 目标文件名“查看进程pid

    这里写图片描述

    在另外一个终端输入:gdb a.out命令进入调试模式后,用attach 进程pid就可以调试该进程,但必须保证进程跑完.
    这里写图片描述
    其他操作和调试单个进程类似

    展开全文
  • GDB进程调试

    2022-04-10 17:09:51
    使用GDB调试的时候,GDB 默认只能跟踪一一个进程,可以在fork 函数调用之前,通过指令设置GDB调试工具跟踪父进程或者是跟踪子进程,默认跟踪父进程。 1.设置调试父进程或者子进程: set follow- fork-mode [parent ...

    使用GDB调试的时候,GDB 默认只能跟踪一一个进程,可以在fork 函数调用之前,通过指令设置GDB调试工具跟踪父进程或者是跟踪子进程,默认跟踪父进程。

    1.设置调试父进程或者子进程: set follow- fork-mode [parent (默认)| child]

    可使用        show follow- fork-mode        查看当前默认调试进程

    2.设置调试模式: set detach-on-fork [on | off]
    默认为on, 表示调试当前进程的时候,其它的进程继续运行,如果为off, 调试当前进程的时候,其它进程被GDB挂起。

    可使用         ​​​​​​​show detach-on-fork         查看当前调试模式

    3.查看调试的进程: info inferiors

    查看当前调试的进程信息,如图所示。

    4.切换当前调试的进程: inferior id (id为info输出的num,而不是进程号)

     如图,此时*显示,已经切换到2号进程。

    5.使进程脱离GDB调试:detach inferiors id

     脱离后显示,父进程已运行完毕。

    展开全文
  • linux gdb详解

    2021-05-09 08:13:30
    一.GDB命令详解在linux程序调成中gdb是最常用的工具。关于gdb的说明可以在linux下直接 man gdb或者gdb --help。GDB man手册翻译如下(英文水平有限,只能表达大体的意思):名称:gdb-gnu调试器概要:gdb [-help] [-nx] ...

    一.GDB命令详解

    在linux程序调成中gdb是最常用的工具。

    关于gdb的说明可以在linux下直接 man gdb或者gdb --help。

    GDB man手册翻译如下(英文水平有限,只能表达大体的意思):

    名称:

    gdb-gnu调试器

    概要:

    gdb    [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir] [prog [core|procID]]

    gdb    [options] --args prog [arguments]

    gdbtui [options]

    说明:

    gdb的目的主要是让你知道程序内部正在运行什么代码,或者是当程序崩溃的时候正在执行什么代码

    GDB主要可以做四种事情来帮助你找到bug:

    启动你的程序,指定任意可以影响程序行为的参数。

    让你的程序在指定的条件停住.

    测试你的程序停止的时候发生了什么。

    改变程序内部的变量,来改正程序的错误继续执行。

    你可以用gdb调试C/C++和modula-2程序,fortran的支持需要有Fortran编译器

    gdb使用shell命令gdb来调用,一旦开始,就从终端读取命令直接gdb退出,你可以通过help命令获取帮助信息。

    可以不带任何参数或选项执行gdb命令,但是最常用的启动gdb的方式是带一个或者两个参数,指定一个可执行文件来作为参数:

    gdb program(gdb+可执行文件名称)

    也可以再gdb文件后面指定可执行文件 和 core文件的名称:

    gdb program core(gdb + 可执行文件 +core文件)

    You can, instead, specify a process ID as a second argument, if you want to debug a running process:

    也可以指定一个进程id作为第二个参数,如果你想调试一个正在运行的程序:

    gdb program 1234(gdb进程名+进程id)

    会附件gdb到进程1234上(除非有一个文件名“1234”;GDB首先检查core文件)

    gdb调试命令:

    break [file:]function

    设置一个断点在函数中(在文件中)

    run [arglist]

    启动程序带上指定的参数

    bt    Backtrace:

    显示堆栈

    print expr

    显示表达式的值

    c

    继续执行你的程序(程序停住后,例如:在断点处停止)

    next

    执行程序的下一行代码(程序停止以后);跨国任何当前行的函数调用。

    edit [file:]function

    查看当前程序停在哪。

    list [file:]function

    显示程序当前停住的代码行附近的代码

    step  单步调试

    执行程序的下一行(程序停住后),进入当前行的函数调用的内部

    help [name]

    显示gdb命令的相关信息。

    quit

    退出gdb

    需要详细的gdb说明,查看using gdb:一个gdb调试程序的指南,stallmain和roland写的,也有可用的在线文档作为gdb入口在gdb项目信息中。

    选项:

    默认的情况下,第一个选项就是执行文件名(等同与"-se"),第二个选项就是core文件名(等同与"-c"),许多选项都有全称和简写,如下:

    全称格式也是工人的,如果你截断他们,只要足够明确也可以使用。(如果你愿意的话,你可以“+”而不是“-”来标记选项,尽管“-”是更常用的)。

    所有的选项和命令行参数都是按顺序处理的,当使用-x选项的时候这个选项会不同。

    -b bps

    设置gdb远程调试的所有串行接口的速度

    -batch

    批处理执行模式,处理完“-x”(和".gdbinit",如果不inhibited)指定的所有命令文件以返回码0退出,如果出错则返回非0,当把gdb作为过滤器的时候,批处理模式非常有用,来在远程电脑上测试下载和执行程序,为了确定它有用,程序退出的消息(当一个程序在gdb模式下发布到控制终端的消息)不发布当使用批处理模式的时候.

    -c FILE, -core=FILE

    使用文件作为一个coredump文件来测试

    -cd=directory

    指定工作目录,不指定则为当前目录

    -d DIRECTORY, -directory=DIRECTORY

    Add directory to the path to search for source files.

    -e FILE, -exec=FILE

    指定可执行文件的名称

    -f, -fullname

    emacs设置这些选项当把gdb作为一个子进程的时候,告诉gdb在每次堆栈显示时候以标准且可识别的方式输出完整的文件名和行号(包含每次程序中断的时候),可识别的形式看上去像两个'32'字符开始,接下来是文件名,行号和字符位置和新行,他们用冒号分割,emacs-to-gdb接口程序用两个‘32’字符作为信号来在一帧上显示源代码。

    -h, -help

    显示帮助信息

    -n, -nx

    不要从任何".gdbinit"结尾的初始化文件执行,正常情况下,这种文件的命令在所有的命令行参数和选项处理完成之后才执行。

    -s FILE, -symbols=FILE

    从文件中读取符号表

    -se=file

    读取符号表的文件和可执行文件

    q, -quiet

    退出,不打印介绍信息和版权信息,这些消息在批处理模式下也不打印

    -tty=device

    使用设备来作为你的标准输入和输出

    --args

    在你的程序名后面传递参数当程序执行的时候。

    -tui

    运行gdb使用文档(控制台)用户接口。

    -write

    允许写入执行文件和core文件

    -x FILE, -command=FILE

    从文件中执行gdb命令

    二.实例

    1.最简单的gdb调试

    文件名:add.c

    代码很简单,实现一个加法,两个数相加,输出结果

    #include

    int add(int x,int y)

    {

    return x+y;

    }

    int main()

    {

    int x = 10;

    int y = 20;

    int num = add(x,y);

    printf(" num = %d\n",num);

    return 0;

    }

    编译gcc -g add.c生成a.out文件(注意编译的时候一定要加上-g选项才能使用gdb调试程序)

    gdb ./a.out

    adcf474f5561

    上图中有一个警告信息,因为我是源代码安装的,拷贝gdb下的python库到指定的目录即可(警告中的目录)

    输入help可以查看帮助信息

    adcf474f5561

    start启动程序

    adcf474f5561

    可以使用n,s命令跑完整个程序,很简单,可以通过这个简单的demo熟悉一下gdb的各种命令。

    adcf474f5561

    2.gdb多进程调试

    gdb调试多进程的命令:

    set follow-fork-mode mode设置调试器的模式

    mode参数可以是

    parent fork之后调试原进程,子进程不受影响,这是缺省的方式

    child fork之后调试新的进程,父进程不受影响。

    show follow-fork-mode 显示当前调试器的模式

    set detach-on-fork mode 设置gdb在fork之后是否detach进程中的其中一个,或者继续保留控制这两个进程

    on 子进程(或者父进程,依赖于follow-fork-mode的值)会detach然后独立运行,这是缺省的mode

    off 两个进程都受gdb控制,一个进程(子进程或父进程,依赖于follow-fork-mode)被调试,另外一个进程被挂起

    info inferiors     显示所有进程

    inferiors processid  切换进程

    detach inferiors processid     detach 一个由指定的进程,然后从fork 列表里删除。这个进程会被

    允许继续独立运行。

    kill inferiors  processid  杀死一个由指定的进程,然后从fork 列表里删除。

    catch fork  让程序在fork,vfork或者exec调用的时候中断

    实例:fork.c

    #include

    #include

    #include

    #include

    int add(int x,int y)

    {

    return x+y;

    }

    int test()

    {

    int num = 0;

    pid_t pid  = fork();

    if(pid == 0)

    {

    while(1)

    {

    num = add(1,2);

    printf("child:pid:%d num = %d\n",getpid(),num);

    sleep(1);

    }

    exit(0);

    }

    while(1){

    num = add(10,20);

    printf("parent:pid:%d num = %d\n",getpid(),num);

    sleep(1);

    }

    return 0;

    }

    int main()

    {

    test();

    return 0;

    }

    编译 gcc -g fork.c

    设置catch fork,查看 follow-fork-mode和detach-on-fork的默认值

    adcf474f5561

    设置detach-on-fork为off,start启动程序,会再fork断点处停止

    adcf474f5561

    再两个进程中的add函数分别设置端点:

    adcf474f5561

    继续执行程序,info inferiors显示进程

    adcf474f5561

    inferiors 2切换进程

    adcf474f5561

    detach inferiors  2

    adcf474f5561

    重新启动gdb来测试kill inferiors 2,如下图

    adcf474f5561

    3.gdb多线程调试

    gdb调试多线程的命令:

    info threads 查询线程信息

    thread threadno 切换线程

    thread apply [threadno] [all] args 对线程列表执行命令

    set print thread-events 控制线程开始和结束时的打印信息

    show print thread-events 显示线程打印信息的开关状态

    实例:文件名thread.c

    代码很简单如下:

    #include

    #include

    #include

    int add(int x,int y)

    {

    return x+y;

    }

    void* thread(void *args)

    {

    int num = 0;

    while(1)

    {

    num += add(1,2);

    sleep(1);

    }

    }

    int main()

    {

    pthread_t tid;

    pthread_create(&tid, NULL, thread, NULL);

    int num = 0;

    while(1)

    {

    num += add(10,20);

    sleep(1);

    }

    return 0;

    }

    编译gcc -g thread.c -lpthread(链接pthread线程库)

    gdb调试:gdb ./a.out

    在线程中两个调用add函数的位置分别设置断点

    adcf474f5561

    start启动程序,c继续执行程序直到断点处

    info threads显示当前程序中的线程

    adcf474f5561

    c继续执行程序,到达第二个程序再执行info threads命令,发现当前程序发生了线程切换,由线程2变为线程1

    adcf474f5561

    thread 2手动切换线程到线程2,再执行info threads查看当前线程

    adcf474f5561

    使用thread apply 命令的示例:

    adcf474f5561

    set print thread-events on/off  这里默认是开启的

    show print thread-events

    adcf474f5561

    adcf474f5561

    展开全文
  • GDB调试子进程

    千次阅读 2021-08-26 20:39:17
    GDB调试子进程设置和指令follow-fork-mode设置detach-on-fork设置inferior指令解决方法 设置和指令 GDB调试子进程主要用到两个设置,一个是 set follow-fork-mode [parent|child] ,另外一个是 set detach-on-fork ...
  • gdb僵尸进程

    2022-04-27 16:56:56
    在用 gdb 调试程序时,终端异常中断,容易造成僵尸进程,我们删除不了 解决方法: 查看所有进程 ps -u 你的用户名称 找到 gdb 的 pid 杀死该程序 kill -9 gdb的pid
  • 4、GDB进程调试 使用GDB 调试的时候,GDB默认只能跟踪一个进程; 可以在 fork 函数调用之前,通过指令设置GDB 调试工具跟踪父进程或者是跟踪子进程,默认跟踪父进程。 测试程序:hello.c: #include <stdio.h&...
  • gdb查看进程状态

    2021-04-11 09:01:46
    info program | info proc 查看程序状态和查看进程状态.
  • gdb之多进程调试

    2021-08-13 09:24:34
    2,gdb attach PID attach 上进程后,进程会暂停,此时可以设置断点或其他操作,因为是后台进程已经正常运行,所以一般输入c继续运行即可 3,信号处理 收到SIGPIPE默认动作是stop,暂...
  • GDB进程调试 (一)多线程调试命令 (1)调试父进程:set follow-fork-mode parent (缺省值,即默认) (2)调试子进程:set follow-fork-mode child (3)设置调试模式:set detach-on-fork [on | off] (缺省值on)...
  • GDB调试单进程及多进程程序 要使用gdb进行程序的调试,那么在程序的编译时需要加上**-g**选项 GDB调试的两种方式 1、直接调试法:gdb拉取新的进程,从头开始跑程序 gdb a.out // 无参调用 gdb --args a.out ARGS...
  • gdb启动多进程程序并切换调试进程

    千次阅读 2019-05-23 20:47:15
    gdb是linux环境下调试C/C++程序的强大工具,但是最近在使用gdb启动一个多进程程序的时候总是意外退出,显示信息中包含Detaching after fork from child process 25377.这一句,而用attach命令附加到正在运行的进程却...
  • 服务器莫名有时会卡死,且用valgrind drd发现不是加锁问题,可以用gdb attach调试,但attach后显示代码入口为deadbeaf/0: gedit vim /etc/sysctl.d/10-ptrace.conf 最后一行改为kernel.yama.ptrace_scope = 0 注意...
  • 今天来学习一下linux下gdb如何调试多进程,在学习之前我我们能先看一张表:这张表是gdb调试的命令表,这对那些对gdb不熟的同学来说是非常有必要的。一、多进程调试的命令1、set follow-fork-mode parent|child因为...
  • 一个事件 看到沒有,一個僵尸进程的父进程是0 可是我没法删除0进程啊! 那我就把gdb这个进程删除了把(我猜测可能是这个进程导致的僵尸进程) kill -9 48987 然后再ps -Al 发现没有僵尸了!
  • 要想使用 `gdb` 调试程序,必须让 `gdb` 程序和被调试程序建立联系,这种联系可以通过程序的可执行文件、core文件或者正在运行的进程来建立,具体调试的时候使用的选项不同,涉及到参数的传递,选项的顺序,多进程...
  • http://www.cnblogs.com/thammer/p/5833935.html 
  • 我编写了一个循环:long i;for (i = 0;...[1] 2570然后用命令gdb ./a.out 2570可以附加到这个进程上。被时进程会中断。或者在GDB里输入attach 2570同样可以附加到进程。输入bt来查看栈(gdb) bt#0 0...
  • 父子进程关系以及GDB进程调试父子进程之间的关系:GDB进程调试代码案例 父子进程之间的关系: 区别: fork函数的返回值不同 父进程中:返回的子进程的ID 子进程中:=0 pcb中的一些数据 当前的进程的id pid ...
  • 使用gdb调试进程

    千次阅读 2015-11-25 22:36:02
    最近有点闲,因为之前工作...例子:首先使用命令gdb进入gdb界面,然后使用命令 attach 100,即可取得进程控制权。 之后操作同1。 gdb调试还有很多东西,暂时就写到这里。
  • 1、查看进程三种方式 ps -A; ps -aux ps -C processName 2、处理进程相关 ./gdb attach processID 不带参数 gdb --args ./abd arg1 arg2 带参数 kill -9 processID 关闭进程 3、忽略一些信号量,...
  • gdb调试多进程与多线程

    万次阅读 多人点赞 2017-06-10 16:32:25
    一,gdb的基础知识1>介绍: gdb是Linux环境下的代码调试工具。 2>使用:需要在源代码生成的时候加上 -g 选项. 3>开始使用: gdb binFile 4>退出:ctrl + d 或 quit 5>调试过程中的常用命令: list/l 行号:显示...
  • gdb调试工具参数说明

    2020-08-13 10:51:10
    gdb - The GNU Debugger 概要 gdb [-help] [-nh] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c core] [-p procID] [-x cmds] [-d dir] [prog|prog procID|...
  • pygdbmi-从GDB的机器接口获取结构化输出 文档 源代码 Python( py ) 机器接口 GDB / MI是GDB的基于行的面向机器的文本... 一个Python类,用于控制和与gdb交互作为子进程 要从gdb获取输出,请使用--interpreter=
  • gdb调试(如何跟踪指定进程

    千次阅读 2019-03-25 17:16:31
    使用gdb调试的时候,gdb只能跟踪一个进程。可以在fork函数调用之前,通过指令设置gdb调试工具跟踪父进程或者是跟踪子进程。默认跟踪父进程。 set follow-fork-mode child 命令设置gdb在fork之后跟踪子进程。 set ...
  • 使用kil -9 进程id,无法杀掉该进程,使用cat /proc/39410/status 查看进程状态,显示如下 Name: server*** State: Z (zombie) Tgid: 39410 Pid: 39410 PPid: 1 TracerPid: 39460 Uid: 0 0 0 0 Gid: 0 0...
  • gdb挂载调试

    千次阅读 2022-03-13 01:50:50
    1)gdb sonia Core***(sonia确保和挂载到设备的一致) 2)使用对应的编译平台gdb版本调试程序 3)加载共享solib动态库 4)set solib-absolute-prefix 符号信息文件夹 5) set solib-search-path 符号信息文件夹 6) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,139
精华内容 17,255
关键字:

gdb进程