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¶
解决方法:
sudo add-apt-repository ppa:ubuntu-support-team/gdb sudo apt update sudo apt install gdb