GDB调试总结

什么是GDB

GDB(GNU Debugger)是一个强大的跨平台调试工具,主要用于 Unix 类系统下的 C、C++ 以及其他编程语言的程序调试。GDB 允许你看到程序执行时发生的事情。通过 GDB,开发者可以进行如下操作:

  1. 启动程序:你可以指定程序的运行环境,传递特定的参数给程序。
  2. 使程序在设定的断点处停止:断点可以是条件式的,依赖于程序的执行路径或达到特定的代码行。
  3. 检查程序停止时的状态:当程序停止后,可以查看在那一刻变量的值或程序的调用栈。
  4. 改变程序的执行环境:可以修改程序的内部状态,例如变量的值,以测试程序的行为。
  5. 动态跟踪程序的执行:可以逐行或逐过程跟踪程序的执行,查看程序的流程和变量状态的变化。

主要特性

  • 断点设置:GDB 允许你设置断点在特定的函数调用或代码行,甚至可以设置条件断点,只在满足特定条件时触发。
  • 单步执行和过程跳转:你可以单步执行程序,查看每一行代码的执行情况,或者一次执行到下一个断点。
  • 变量检查和修改:在调试过程中,可以检查和修改变量的值,这对于测试不同的输入和修复错误很有帮助。
  • 调用栈分析:可以查看函数调用栈,了解当前执行点是如何从程序的其他部分调用的。
  • 远程调试:GDB 支持远程调试,允许你连接到另一台计算机上的一个进程,进行调试操作。
  • 多线程调试:GDB 可以管理多线程程序,允许单独或整体地调试各线程。

使用GDB

要使用 GDB 调试程序,首先需要用调试信息编译该程序,通常是在编译时添加 -g 选项。例如,使用 GCC 编译 C 程序时:

gcc -g -o myprogram myprogram.c

然后,启动 GDB:

gdb ./myprogram

在 GDB 环境中,你可以设置断点、运行程序、观察变量等等。例如,设置一个在 main 函数开始处的断点:

(gdb) break main

然后启动程序执行:

(gdb) run

在程序停止后,可以检查和修改变量,继续执行,或单步通过代码。

GDB 是一种非常专业的工具,对于深入了解程序错误和行为具有不可替代的作用,尤其是在复杂的程序或系统级程序调试中非常有效。

GDB的命令

启动,退出,查看代码

启动GDB

  • gdb <程序名>:启动GDB并加载指定的程序。
  • gdb <程序名> <核心文件>:使用程序的核心转储文件启动GDB。

加载和运行程序

  • file <程序名>:在GDB中加载一个新的程序。
  • run [参数]:开始运行当前在GDB中加载的程序,可以加参数运行。

查看和控制执行

  • list <函数名>:显示指定函数的源代码。
  • list <行号>:显示从指定行号开始的源代码。
  • list:继续显示上次list命令后的源代码。
daic@daic:~/Linux/lesson08$ gdb test
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) set args 10 20
(gdb) show args
Argument list to give program being debugged when it is started is "10 20".

调试时代码文件要和可运行文件在同一个目录

断点操作

在GDB中设置和管理断点是调试程序的关键部分,允许你在特定的代码行或函数调用时暂停程序的执行。这使得可以检查程序的当前状态,例如变量的值、程序的调用栈等。以下是一些常用的GDB断点操作命令:

设置断点

  • break <位置>:在指定位置设置断点。位置可以是源代码的行号,也可以是函数名。例如:
    • break main:在main函数的开始处设置断点。
    • break 42:在当前文件的第42行设置断点。
    • break file.c:42:在file.c文件的第42行设置断点。

条件断点

  • break <位置> if <条件>:在指定位置设置一个条件断点,仅当条件为真时才会停止。条件可以是任何有效的C表达式。例如:
    • break 100 if x==0:在第100行设置断点,但只有当变量x等于0时才会触发。

查看断点

  • info breakpointsinfo break:显示所有设置的断点及其详细信息。

禁用和启用断点

  • disable <断点号>:禁用指定的断点。
  • enable <断点号>:启用指定的断点。
    • enable <断点号> once:启用断点一次,当断点被触发后自动禁用。
    • enable <断点号> delete:启用断点,当断点被触发后自动删除。

删除断点

  • delete <断点号>:删除指定的断点。不加断点号则会询问是否删除所有断点。
  • clear <位置>:删除指定位置的所有断点。

断点命令

  • commands <断点号>:为指定的断点设置一系列命令,这些命令在每次断点触发时自动执行。结束命令输入时输入end。例如:

    (gdb) commands 1
    > print x
    > continue
    > end
    

    这会在断点1触发时打印变量x的值,然后继续执行程序。

通过灵活使用这些命令,你可以有效地控制程序的执行流程,进行深入的调试。此外,GDB还支持在断点触发时自动执行特定的命令,这对于自动化某些调试任务非常有用。

调试命令

在GDB中,有多种命令可用于执行和控制程序的调试。这些命令可以帮助你逐步执行程序、检查变量、修改程序状态等。以下是一些常用的GDB调试命令的详细说明:

控制程序执行

  • run [参数]:开始运行程序,可加入命令行参数。例如,run arg1 arg2
  • continuec:从当前位置继续执行程序,直到遇到下一个断点或程序结束。
  • steps:执行下一行代码,如果该行调用了函数,则进入该函数。
  • nextn:执行下一行代码,但不进入函数(即跳过函数调用)。
  • finish:运行直到当前函数完成返回,并打印返回时的函数返回值。
  • until:继续执行到达新的更高的源代码行或退出当前循环。

检查和修改数据

  • print <表达式>p <表达式>:打印表达式的值。表达式可以是变量名、函数调用或任何合法的C表达式。
  • set variable <变量名>=<值>:设置变量的值。
  • display <表达式>:自动显示表达式的值,每次程序停止时都会显示。
  • undisplay <编号>:停止自动显示之前设置的表达式。
  • watch <表达式>:设置一个观察点,当表达式的值发生变化时,程序暂停执行。

查看程序状态

  • info locals:显示当前栈帧局部变量的值。
  • info args:显示当前栈帧函数的参数。
  • backtracebt:显示当前调用栈,即函数调用序列。
  • frame <编号>:切换到指定的栈帧。
  • list:显示当前代码附近的源代码。也可以指定特定行或函数来查看代码。

调试多线程程序

  • info threads:列出所有线程。
  • thread <编号>:切换到指定编号的线程。

使用命令文件

  • source <文件名>:执行一个包含GDB命令的文件。

退出GDB

  • quitq:退出GDB。

这些是GDB中最常用的基本命令。通过结合使用这些命令,你可以对程序进行深入的调查和分析,从而识别并解决复杂的程序错误。在使用GDB时,你可能会发现调试是一个迭代过程,通常需要根据程序的行为和观察结果不断调整断点和命令。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要对SLAM程序进行GDB调试,首先需要进入GDB调试环境。可以使用命令"gdb [程序名]"来进入GDB调试。例如,在ORB_SLAM3的ROS示例中,可以使用命令"gdb Stereo"进入GDB调试环境。 进入GDB调试后,可以使用一些常用的GDB命令进行调试。例如,可以使用"run"命令来运行程序,使用"break"命令设置断点,使用"step"命令逐行执行程序,使用"print"命令打印变量的值等等。这些命令可以帮助我们分析程序的执行过程和调试问题。 请注意,GDB是一个命令行模式的调试工具,因此需要熟悉一些基本的GDB命令才能进行有效的调试。在GDB调试过程中,可以通过加上"-q"参数来禁止输出一些不必要的信息,以便更清晰地查看调试信息。 总结一下,要对SLAM程序进行GDB调试,可以使用"gdb [程序名]"命令进入GDB调试环境,并使用一些常用的GDB命令进行调试,例如"run"、"break"、"step"、"print"等命令[2]。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SLAM工具|GDB调试从入门到精通](https://blog.csdn.net/Yong_Qi2015/article/details/122463019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [GDB调试 ORBSLAM3](https://blog.csdn.net/qq_41861406/article/details/125034738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值