Linux编程-GDB调试

本文最后更新于:1 年前

常用命令

命令 命令缩写 命令说明
set args 设置主程序的参数
break b 设置断点 b test.c:20
d 删除断电,先用info b查看断电,然后按照断点序号删
run r 运行程序
next n 执行当前语句,如果该语句为函数调用,不会进入函数内部
step s 执行当前语句,如果该语句为函数调用,则进入函数执行其中的第一句语句。但是如果函数是库函数或第三方没有源代码的函数,用s也进不去。
print p 打印变量值 print num
p/x 十六进制打印
continue c 继续允许程序,直到下一个断点
finish 退出进入的函数,若是你的函数里有断点,是不能退出的
until u 在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,即跳出当前(for)循环
set var name=value 设置变量的值,如set var i=10
watch 监视某个变量,变量值改变时停下 watch i
quit q 退出gdb调试
bt 查看函数调用栈
kill k 杀死当前调试进程
list 查看近十行代码

GDB查看core文件

  • 使用 ulimit -a查看当前core文件的生成限制
  • 使用 ulimit -c unlimited解除该限制
  • 运行需要调试的程序
  • 使用gdb ./文件 生成的core文件直接查看段错误的位置
  • 在gdb内使用bt命令可以查看函数的调用栈

多进程调试

  • 调试父进程 set follow-fork-mode parent (缺省)

  • 调试子进程 set follow-fork-mode child

  • 设置调试模式 set detach-on-fork [on|off] ,

    • 缺省是on,表示调试当前进程时,其他进程继续运行
    • off时调试当前进程,其他进程挂起
  • 查看当前调试的进程 info inferiors

  • 切换当前调试的进程 inferior 进程id

    调试已在运行的进程

    gdb book1 -p 21495

多线程调试

  • 查看线程 info threads
  • 切换线程 thread 线程id
  • 只运行当前线程 set scheduler-locking on
  • 运行全部线程 set scheduler-locking off
  • 指定某一线程执行某GDB指令 thread apply 线程id cmd
  • 所有线程执行某GDB指令 thread apply all cmd