GDB 调试程序一般有三种方式
- gdb filename
- gdb attach pid
- gdb filename corename、
1.直接调试目标程序
附加程序,然后run起来;
2.附加进程
调试正在运行的程序;
gdb attach pid detach
3.调试core文件
程序崩溃,产生core文件;
ulimit -c查看是否开启产生core机制;
使用 ulimit -c unlimited(unlimited 是 -c 选项值)直接修改成不限制大小;
如果要使该选项永久生效,加到/etc/profile中;
gdb filename corename,启动调试,找到崩溃地方,通过bt命令看调用堆栈;
- run 命令
- continue 命令
- break 命令
- backtrace 与 frame 命令
- info break、enable、disable 和 delete 命令
- list 命令
- print 和 ptype 命令
- info 和 thread 命令
- next、step、util、finish 和 return 命令
- disassemble 命令
- set args 和 show args 命令
- tbreak 命令
- watch 命令
- display 命令
将 print 打印结果显示完整
set print element 0
让被 GDB 调试的程序接收信号
handle SIGINT nostop print
- 多线程下禁止线程切换
set scheduler-locking on
- 条件断点
一般会用到三种断点:普通断点、条件断点和硬件断点。
硬件断点又叫数据断点,这样的断点其实就是前面课程中介绍的用 watch 命令添加的部分断点(为什么是部分而不是全部,前面介绍原因了,watch 添加的断点有部分是通过软中断实现的,不属于硬件断点)。硬件断点的触发时机是监视的内存地址或者变量值发生变化。
break 11 if i==5000
- 使用 GDB 调试多进程程序
- 用 GDB 先调试父进程,等子进程 fork 出来后,使用 gdb attach 到子进程上去,当然这需要重新开启一个 session 窗口用于调试,gdb attach 的用法在前面已经介绍过了;
- GDB 调试器提供了一个选项叫 follow-fork,可以使用 show follow-fork mode 查看当前值,也可以通过 set follow-fork mode 来设置是当一个进程 fork 出新的子进程时,GDB 是继续调试父进程还是子进程(取值是 child),默认是父进程( 取值是 parent)
(gdb) show follow-fork mode Debugger response to a program call of fork or vfork is "parent". (gdb) set follow-fork child (gdb) show follow-fork mode Debugger response to a program call of fork or vfork is "child". (gdb)
GDB TUI——在 GDB 中显示程序源码
开启 GDB TUI 模式有两个方法。
方法一:使用 gdbtui 命令或者 gdb-tui 命令开启一个调试。
gdbtui -q 需要调试的程序名
方法二:直接使用 GDB 调试代码,在需要的时候使用切换键 Ctrl + X + A 调出 GDB TUI 。
- (cmd)command 命令窗口,可以输入调试命令
- (src)source 源代码窗口, 显示当前行、断点等信息
- (asm)assembly 汇编代码窗口
- (reg)register 寄存器窗口
可以通过“layout + 窗口类型”命令来选择自己需要的窗口
在默认设置下,方向键和 PageUp/PageDown 都是用来控制 GDB TUI 的 src 窗口的,因此,我们常用上下键显示前一条命令和后一条命令的功能就没有了,不过可以通过 Ctrl + N/Ctrl + P 来获取这个功能。
我们可以通过 focus 命令来调整焦点位置,默认情况下焦点是在 src 窗口,通过 focus next 命令可以把焦点移到 cmd 窗口,这时候就可以像以前一样,通过方向键来切换上一条命令和下一条命令。同理,也可以使用 focus prev 切回到源码窗口,如果焦点不在 src 窗口,我们就不必使用方向键来浏览源码了。
GDB 高级扩展工具——CGDB