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