gdb使用学习

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

猜你喜欢

转载自blog.csdn.net/shhchen/article/details/88555210