3.7 KiB
使用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功能大全
-
设置断点:使用
break
命令在特定的源代码行或函数上设置断点。例如:- 在
file.cpp
的第10行设置断点:break file.cpp:10
- 在名为
my_function
的函数上设置断点:break my_function
- 在
-
开始执行程序:使用
run
命令开始执行程序。程序将运行到遇到的第一个断点处。 -
单步执行:在调试时,你可以使用以下命令单步执行代码:
next
(或n
):执行下一行代码,但不进入函数。step
(或s
):执行下一行代码,如果是函数调用则进入函数。
-
查看变量值:使用
print
(或p
)命令查看变量值。例如,print variable_name
将显示variable_name
的值。你还可以使用display variable_name
命令,它会在每次停止时自动显示变量的值。 -
继续执行:使用
continue
(或c
)命令继续执行程序,直到遇到下一个断点或程序结束。 -
查看栈帧:使用
frame
命令查看和切换栈帧。例如:frame
:显示当前栈帧。frame 2
:切换到第2个栈帧。
-
查看堆栈:使用
backtrace
(或bt
)命令查看当前调用堆栈。 -
查看源代码:使用
list
(或l
)命令查看源代码。例如:list
:显示当前执行点附近的源代码。list file.cpp:10
:显示file.cpp
第10行附近的源代码。
-
退出
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 将无法找到它们并设置断点。