docs/gdb debug.md
2025-01-07 15:09:50 +08:00

94 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 使用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 将无法找到它们并设置断点。