gdb cheatsheet


1. gdb调试正在运行的某一进程 $ gdb attach PID $ break xxx $ continue (继续运行)
    gdb调试某一可执行程序 $ gdb program $ break xxx $ run (运行程序)

    gdb调试需要指定命令行参数的程序     $gdb   --args   a.out  arg1  arg2  arg3

2. break func 设置断点(函数)
    break file:line 设置断点 (文件:行号)
    info breakpoints (info b) 查看断点
    delete NUM 删除断点(断点Num)
    disable NUM 去使能断点(断点Num)
    enable Num 使能断点(断点Num)

    disable 未指定断点Num,去使能所有断点

    break 断点  if 条件

    例子:

    break 2997  if 0 == strcmp("segrt.xmlui", pcPluginName)

    enable XXX 


3. untile LINE (u LINE) 运行到某行
    next 单行调试(不进入函数)
    step 单步调试(进入函数)

4. print XXX (p XXX) 打印变量XXX
    p/x XXX 十六进制打印变量XXX
    display XXX 显示变量XXX(单步调试每一步都会打印此变量;删除时使用delete display NUM)
    watch XXX 监控变量XXX(变量改变后,打印变量 新值+旧值;删除时使用delete NUM,用info break查看NUM)
    set print pretty 使打印格式更可读

    set print elements 300  设置打印长度 (例如:打印字符串时,字符串太长,无法打印全,可以使用此命令设置打印长度)

    show print elements  显示打印长度

5. set var=VALUE 设置某变量的值

6. info threads 查看当前所有线程
    thread NUM 切换到threaid = NUM的线程

7. backtrace (bt) 查看当前线程的调用栈
    frame 编号 查看特定的栈帧
    info locals 查看局部变量 (每一次函数调用会在栈上分配一个栈帧,函数的局部变量在特定的栈帧里)

8. set follow-fork-mode child 在调用fork之后,接着调试子进程
    set follow-fork-mode parent 在调用fork之后,接着调试父进程(默认)

9. 某一个函数多个线程都会执行,使用gdb跟踪时,如何禁止gdb在线程之间进行切换?
    set schedule-locking on (默认情况下为:set schedule-locking off)

10. x  ADDRESS   查看内存地址中的值

11. gdb控制/屏蔽信号   (信号/异步事件)

       info signals / info handle   查看所有信号的处理方式

       handle signal keywrods...

       Keywords:

           nostop:  信号发生时,GDB不会停住被调试程序运行,但会打印消息告诉你接受到此信号

           stop: 信号发生时,GDB停住被调试程序运行

           print: 信号发生时,GDB会打印消息告诉你接收到此信号

           noprint: 信号发生时,GDB不会打印消息告诉你接收到此信号

           pass / noignore: 信号发生时,GDB将此信号交给被调试程序处理

           nopass / ignore: 信号发生时,GDB不会将此信号交给被调试程序处理      

       Signal:

           具体某一信号    SIGXXX

           某一范围内信号   SIGXXX-SIGYYY

           所有信号  all

     (kill -s signal pid    发送信号signal到pid进程)