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

3.7 KiB
Raw Blame History

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