GDB调试

1、信息显示

  • 设置启动时不显示提示信息

    gdb -q 或在 ~/.bashrc中为gdb设置一个别名。

  • 设置gdb在退出时不显示提示信息

    set confirm off(可以把这个命令加到.gdbinit文件里)。

  • 设置输出信息多时不会暂停输出

    set pagination off 或 set height 0。

2、函数

  • 列出函数名字

    info functions 可列出可执行文件的所有函数名。

    该命令也支持正则表达式,info functions regex 会列出符合正则表达式的函数名称。

  • 进入带调试信息的函数

    step(缩写为s)进入函数。

    next(缩写为n)不进入函数,继续执行下一行。

  • 进入不带调试信息的函数

    gdb默认不会进入不带调试信息的函数,可执行"set step-mode on"命令,这样gdb就不会跳过没有调试信息的函数,接下来可以使用调试汇编程序的办法去调试函数。

  • 退出正在调试的函数

    当单步调试一个函数时,如果不想继续跟踪下去了,有两种退出方式。

    1. finish命令,此时函数会继续执行完。
    2. return命令,此时函数不会执行下面的代码而直接返回。
  • 直接执行函数

    call 或 print命令可以直接调用函数执行。

  • 打印函数堆栈帧信息

    info frame 或 i frame命令显示函数堆栈帧信息。

  • 选择函数堆栈帧

    当程序断掉后,通过 bt 命令来查看堆栈信息,可以用 frame n 命令选择函数堆栈帧,也可以用 frame addr 命令选择函数堆栈帧,其中addr是堆栈地址。

3、断点

  • 在文件行号上打断点

    在当前文件中的某一行打断点:b linenum,

    也可以显示指定文件:b file:linenum

    注意:通过行号设置断点时,如果更改了源程序,那么之前设置的断点就可能不是想要的了。

  • 设置临时断点

    可以使用 tbreak/tb linenum 命令来设置临时断点,该断点只生效一次后被删除。

  • 设置条件断点

    可使用 break linenum if cond 命令来设置条件断点,只有当条件满足时,断点才会被触发。

  • 忽略断点

    ignore bnum count 命令忽略断点,代表接下来的count次编号为bnum断点都不会让程序中断。

4、观察点

  • 设置观察点

    gdb可以使用 “watch variable” 或 “watch *(dataType*)address” 命令设置观察点,即当一个变量值发生变化时,程序会停下来。

  • 查看断点

    info watchpoints列出当前所设置了的所有观察点。

  • 设置观察点只针对特定线程生效

    可以使用 “watch variable thread threadnum” 命令来设置观察点只针对特定线程生效,也就是只有编号为threadnum的线程改变了变量的值,程序才会停下来,其他编号线程改变变量的值不会让程序停住。

  • 设置读观察点

    gdb可以使用 "rwatch/rw variable " 命令设置读观察点,即当发生读取变量行为时,程序就会暂停。“rwatch” 命令只对硬件观察点才生效。

  • 设置读写观察点

    命令 “awatch/aw variable” 设置读写观察点,当发生读取变量或改变变量值的行为时,程序就会暂停。

5、打印

  • 打印ASCII和宽字符字符串

    “x/s str” 命令打印ASCII字符串。如果当前平台宽字符的长度为4个字节,则用 “x/ws” 命令,如果是2个字节,则用 “x/hs” 命令。

  • 打印STL容器内容

    gdb 7.0之后可通过命令 “info pretty-printer” 来改善显示结果。

  • 打印大数组中的内容

    通过命令 “set print element 0” 或 “set print elements unlimited” 来设置输出为没有限制。

  • 打印数组中任意连续元素值

    如果要打印数组中任意连续元素的值,可以使用 “p array[index]@num” 命令,其中index是数组索引,num是连续多少个元素。如果要从数组开头打印连续的值,可以使用命令 “p *[array]”。

  • 打印数组的索引下标

    当打印一个数组时,默认是不打印下标的,可通过命令 “set print array-indexes on” 来进行打印显示下标设置。

  • 打印函数局部变量的值

    如果要打印函数局部变量的值,可以使用 “bt full” 命令显示各个函数的局部变量。

    也可以使用 “bt full n” 来从内到外显示n个栈帧及其局部变量。

    而 “bt full -n” 是从外向内显示n个栈帧及其局部变量。

    “info locals” 只打印当前函数局部变量的值。

  • 打印静态变量

    如果在gdb中直接打印静态变量,则结果并不一定是想要的,可以通过显式指定文件名来调试。

  • 打印变量的类型

    可通过命令 “whatis variable” 来查看变量的类型,如果想查看详细的类型信息,可通过 “ptype variable” 来查看。

  • 打印内存的值

    gdb中使用“x”命令来打印内存的值,格式为“x/nfu addr”。含义为以f格式打印从addr开始的n个长度单元为u的内存值。参数具体含义如下:
    a)n:输出单元的个数。
    b)f:是输出格式。比如x是以16进制形式输出,o是以8进制形式输出,等等。
    c)u:标明一个单元的长度。b是一个byteh是两个byte(halfword),w是四个byte(word),g是八个byte(giant word)。

6、多进程

  • 调试已经运行的进程

    1. 命令 “gdb process processID” 可以调试已经运行的进程,processID可以使用 “ps” 命令来获取进程ID。
    2. 使用 “gdb attach processID” 命令来附加在进程上。两种方式都可使用 “detach” 命令脱离进程。
  • 调试子进程

    gdb调试多进程程序时,gdb默认会追踪父进程,如果要调试子进程,要使用命令 “set follow-fork-mode child”。

  • 同时调试父进程和子进程

    如果要同时调试父进程和子进程,可以使用 “set detach-on-fork off”(默认是on) 命令,这样gdb就能同时调试父子进程,此时可以使用 “i inferiors” 命令查看进程状态,当父进程退出后,用 “inferior infno” 命令切换到子进程去调试。如果想让父子进程都同时运行,可以使用 “set schedule-multiple on” (默认是off)命令。

7、多线程

  • 查看线程信息

    用gdb调试多线程时,可以使用 “i threads” 命令查看所有线程的信息。

  • 不显示线程启动和退出信息

    默认情况下gdb检测到线程产生和退出时,会打印提示信息。可以使用 “set print thread-events off” 命令来不显示打印信息。

  • 只允许一个线程运行

    gdb在调试多线程时默认是所有线程同时运行的,如果只想调试一个线程可以使用命令 “set scheduler-locking on” 命令,让其它线程暂停运行。

  • 打印所有线程的堆栈

    使用命令 “thread apply all bt” 打印所有线程的堆栈。

8、core dump文件

  • 设置生成core dump文件

    1. 使用 “ulimit -c unlimited” 命令设置系统生成core文件的大小为不限制。
    2. 通过 “ulimit -a” 命令查看设置是否成功。
    3. 运行程序,当发生错误时会生成core文件,具体core文件名为core.processID。
  • 加载调试core文件

    使用命令 “gdb program core文件” 来恢复程序出错现场,使用 “bt” 查看调用堆栈来定位出问题的具体信息。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值