docs/gdb debug.md

94 lines
3.7 KiB
Markdown
Raw Normal View History

2025-01-07 15:09:50 +08:00
## 使用gdb
cmake加编译选项
```
add_compile_options(-g)
```
- 一般情况
```
gdb ex run --args /path/to/exe/program
```
- ros2 node
```
ros2 run --prefix 'gdb -ex run --args' <pkg> <node> --all-other-launch arguments
```
- nav2 launch file
```
start_sync_slam_toolbox_node = Node(
parameters=[
get_package_share_directory("slam_toolbox") + '/config/mapper_params_online_sync.yaml',
{'use_sim_time': use_sim_time}
],
package='slam_toolbox',
executable='sync_slam_toolbox_node',
name='slam_toolbox',
prefix=['xterm -e gdb -ex run --args'],
output='screen')
```
- nav2 bring up
To debug directly from the nav2 bringup launch files you may want to do the following:
- Add `prefix=['xterm -e gdb -ex run --args']` to the non-composed node in the appropriate launch file.
- Recompile the package of interest with `-g` flag for debug symbols.
- Launch normally with `ros2 launch nav2_bringup tb3_simulation_launch.py use_composition:=False`. A seperate xterm window will open with the proccess of intrest running in gdb.
程序设置断点
```
__builtin_trap();
```
参数里面设置断点
```
prefix=['xterm -e gdb --eval-command="break nav2_behaviors::RequestGoals::inputCommandCallback" --eval-command="run" --args'],
```
## gdb功能大全
1. 设置断点:使用`break`命令在特定的源代码行或函数上设置断点。例如:
- 在`file.cpp`的第10行设置断点`break file.cpp:10`
- 在名为`my_function`的函数上设置断点:`break my_function`
2. 开始执行程序:使用`run`命令开始执行程序。程序将运行到遇到的第一个断点处。
3. 单步执行:在调试时,你可以使用以下命令单步执行代码:
- `next`(或`n`):执行下一行代码,但不进入函数。
- `step`(或`s`):执行下一行代码,如果是函数调用则进入函数。
4. 查看变量值:使用`print`(或`p`)命令查看变量值。例如,`print variable_name`将显示`variable_name`的值。你还可以使用`display variable_name`命令,它会在每次停止时自动显示变量的值。
5. 继续执行:使用`continue`(或`c`)命令继续执行程序,直到遇到下一个断点或程序结束。
6. 查看栈帧:使用`frame`命令查看和切换栈帧。例如:
- `frame`:显示当前栈帧。
- `frame 2`切换到第2个栈帧。
7. 查看堆栈:使用`backtrace`(或`bt`)命令查看当前调用堆栈。
8. 查看源代码:使用`list`(或`l`)命令查看源代码。例如:
- `list`:显示当前执行点附近的源代码。
- `list file.cpp:10`:显示`file.cpp`第10行附近的源代码。
9. 退出`gdb`:使用`quit`(或`q`)命令退出`gdb`。
## gdbinit
在 Ubuntu 上,你可以通过创建一个 `.gdbinit` 文件来为 GDB 提供启动时的配置。`.gdbinit` 文件通常位于用户的主目录下。在这个文件中,你可以添加多个文件断点和函数断点。
首先,在你的主目录下创建 `.gdbinit` 文件(如果还没有的话):
bashCopy code
`touch ~/.gdbinit`
然后,使用文本编辑器打开 `.gdbinit` 文件并添加你需要的断点。例如:
kotlinCopy code
`# 文件断点 break file1.cpp:123 break file2.cpp:456 # 函数断点 break my_function break my_namespace::my_class::my_method`
在这个例子中,我们为 `file1.cpp` 的第 123 行和 `file2.cpp` 的第 456 行添加了文件断点。同时,我们还为 `my_function` 函数和 `my_namespace::my_class::my_method` 方法添加了函数断点。
请注意,你需要确保源代码中的文件和函数名称与 `.gdbinit` 文件中的名称完全匹配,否则 GDB 将无法找到它们并设置断点。