docs/应用实践/开发调试教程/开发工具使用实践/使用gdb工具调试.md
GDB,GNU项目调试器,允许您查看另一个程序在执行时“内部”发生了什么,或者其他程序在崩溃时正在做什么。
GDB可以做四种主要的事情(加上其他支持这些事情的事情)来帮助您在行动中捕捉错误:
这些程序可能与GDB(本地)在同一台机器上执行,也可能在另一台机器(远程)上执行,或者在模拟器上执行。GDB可以在大多数流行的UNIX和Microsoft Windows变体以及macOS上运行。
在apollo容器中没有内置gdb调试工具,需要用户自行下载
sudo apt install gdb
在使用buildtool工具编译代码时,可通过参数--dbg将调试信息加到编译结果中
buildtool build --dbg
在Apollo中,启动一个模块通常是通过mainboard+dag文件的方式启动,所以我们可以将mainboard作为progarm, dag文件作为参数传入
gdb --args mainboard -d modules/my_component/dag/my_component.dag
输出 "Reading symbols from mainboard...done." 表明程序已加载
设置断点的命令是break, 缩写形式为b
设置断点在MyComponent::Init()函数入口处
(gdb) b MyComponent::Init
注:命令行会提示“Function "MyComponent::Init" not defined”,这是因为我们想要调试的程序是动态库,此时还没有被调用。下一行“Make breakpoint pending on future shared library load? (y or [n])”会询问在之后共享库加载后设置断点,此时输入"y"即可
查看断点信息的命令是info break, 缩写形式为i b
(gdb) info break
在上一步中我们在MyComponent::Init函数处设置了断点,通过info break,我们可以看到设置的断点信息
当我们设置好断点后,此时我们再次运行,断点等信息即可加入到调试中
(gdb) r
程序运行到断点处(MyComponent::Init)
单条运行程序命令是next和step,缩写形式为n和s
next: 单步执行程序,跳过函数调用
step: 单步执行程序,进入函数调用
(gdb) n
(gdb) s
查看函数堆栈信息的命令是backtrace, 缩写形式为bt
(gdb) bt
(gdb) c
这时我们已经简单的调试了我们的程序,如果您有更多的调试项,可参考gdb官方文档