Skip to content

gdb调试

本文档记录gdb相关实践经验。

gdb实现原理

参考链接

gdb命令

  • thread apply [threadno] [all] args - 将命令传递给一个或多个线程,参见链接。 比如,thread apply all continue表示将continue命令传递给所有线程,也就是让所有线程都继续运行。

  • rbreak - Set a breakpoint for all functions matching REGEXP. 参考链接

    e.g. rbreak file.C:.* - 给file.C的所有函数加上断点。

  • info

  • info inferior - 可以查看当前调试的进程的PID。另外一种方法是在gdb命令行中直接调用C函数:print (int)getpid()。参考:链接
  • info source - 当前调试的源文件路径。
  • info proc - 当前进程信息
    • info proc files - 当前进程打开的文件(和文件描述符)。
  • attach - 连接到正在运行的进程。与gdb -p效果相同。
  • detach - 取消连接的进程。
  • handle <signal> print pass nostop - 捕获信号(比如SIGSEGV)并且忽略它。handle <signal nostop
  • set - 修改变量的值,比如set x=10(或set var x=10)将变量x的值改为10。参考博客
  • show directories
  • print - gdb默认设置打印字符串的长度为200;更改打印最大长度:set print elements <number-of-elements>0表示unlimited.
  • ptype <variable name> - 打印变量类型。

断点

添加断点:

break file:line_no

查看断点:

info break

删除第2个断点:

delete 2

条件断点

参考:博客

break ... if cond

观察断点

捕捉断点

try...catch

打印长度的限制

  • Value sizes - 参考:文档
set max-value-size bytes
set max-value-size unlimited
  • 打印字符长度限制

gdb默认设置打印字符串的长度为200;更改打印最大长度:set print elements

coredump

gdb命令:gcore

参考:https://man7.org/linux/man-pages/man5/core.5.html

WSL(windows虚拟机)无法使用gdb

解决方法

安装PPA的daily build版本

sudo add-apt-repository ppa:ubuntu-support-team/gdb sudo apt update sudo apt install gdb