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 directoriesprint- 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