本文共 1729 字,大约阅读时间需要 5 分钟。
GDB 是 GNU 项目中的一个调试器,它允许你在程序运行期间观察正在执行的操作,或在程序崩溃时查看崩溃时的状态。GDB 主要用于调试可执行程序以及分析核心转储文件(Coredump)。
GDB 可以执行以下主要操作:
在 Linux 下,gcc 或 g++ 编译的二进制程序默认是发布版本(release),即不包含调试信息。如果你想使用 GDB调试,请在编译时添加以下选项:
gcc -g -o Feb5 fib.o
这样,生成的二进制文件“Feb5”将包含调试信息,适合用 GDB 调试。
##步骤说明:使用 GDB 调试可执行程序
编译准备阶段
编译阶段不需要特别的处理,只需确保使用了-g 选项以生成调试版本。如果你使用的是现有的二进制文件,可以通过下述方式启动调试: 启动调试
在终端中启动 GDB:gdb Feb5
浏览代码
使用list 或 l 命令浏览代码: 显示某一行及其后续 10 行代码:
list /l 5
显示某个函数的代码:
list /l fib
运行程序
使用run 或 r 命令运行程序: run /r
这将执行程序并输出结果(如斐波那契数的第五项为 "5")。
设置断点
断点是调试中的重要工具,可以帮助你定位程序的执行路径。在某一行设置断点:
break /b 5
在某个函数的开头设置断点:
break /b fib
查看断点详情:
info break
执行控制命令
逐步执行当前行:
next /n
逐行执行代码(等同于 Visual Studio 的 F11):
step /s
打印变量或表达式的值:
print /p var_name
继续执行当前断点后的代码:
continue /c
删除和启用/禁用断点
操作断点的方法:delete /d 1enable /e 2disable /d 2
退出 GDB
当调试完成后,输入以下命令退出:quit /q
如果程序在崩溃时生成了内存镜像文件(core),你可以用 GDB 分析 crashes。
假设你的程序中有如下错误:
int* p = 0;*p = 10;
这种情况会导致 segment fault 错误(内存越界)。
确保以下条件:
Linux 环境:修改 ulimit 设置:
ulimit -c unlimited
这将允许较大的核心转储文件生成。
磁盘空间:必须有足够的磁盘空间来存储 core 文件。
运行程序时,确保程序会崩溃:
./Feb5
这将生成一个名为 Feb5.core 的核心转储文件。
完成后,启动 GDB,并指定核心文件:
gdb Feb5 Feb5.core
GDB 会自动进入崩溃模式,并显示相关信息。例如:
_program received signal 11, stopped at 0x0 in _some_function ()from /absolute/path/to/Feb5()ギ多少.backtrace[l000x0000000.0 0 1 2 3]
你可以使用 backtrace 命令查看调用栈:
backtrace /bt
GDB 会显示导致程序崩溃的具体代码行。例如:
0x004d3b0 in _some_function () at Feb5.c:6: ,pointers:( cabelonedefault */
此外,使用 print 命令分析错误信息:
print /p *p
通过以上步骤,你可以使用 GDB 进行程序调试和核心文件分析。如果有任何问题,可以参考 GDB 在线文档或社区求助。
转载地址:http://vjzaz.baihongyu.com/