GDB(GNU Debugger)是一个功能强大的调试工具,可以帮助开发者在程序运行过程中查找和修复问题。本文将介绍如何使用 GDB 调试程序,包括常用命令、调试 core 文件和正在运行的程序。
在使用 GDB 调试程序时,掌握一些常用命令非常重要。以下是一些基础命令和用法:
在 Linux 系统中,使用以下命令安装 GDB:
yum -y install gdb
或者在 Ubuntu 系统中使用:
sudo apt-get install gdb
要启动 GDB 并调试一个程序,可以使用以下命令:
gdb 目标程序
例如,调试一个名为 my_program
的程序:
gdb my_program
在 GDB 中,你可以使用 set args
来为程序设置命令行参数。例如:
set args 张三 西施 我是一只傻傻鸟
这将模拟命令行参数传递给程序。假设程序的命令行参数使用 argc
和 argv
获取,执行程序时,它将使用这些参数。
使用 break
或简称 b
命令设置断点。例如:
break 20
该命令会在程序的第 20 行设置一个断点。你也可以为函数名设置断点:
break main
使用 run
或简称 r
来启动程序,程序会在设置的断点处停止:
run
如果程序没有遇到断点,它会直接运行至结束。
使用 step
或简称 s
命令可以逐步执行当前语句,并且进入函数内部:
step
如果你只是希望跳过当前函数调用而不进入函数体,可以使用 next
或简称 n
。
要查看变量的当前值,可以使用 print
或简称 p
命令:
print variable_name
例如,查看变量 i
的值:
print i
使用 bt
(backtrace)命令查看当前的函数调用栈:
bt
当程序崩溃时,系统可能会生成一个 core 文件,包含了程序的内存快照和崩溃时的状态信息。使用 GDB 可以帮助分析这些文件。
在 Linux 中,可以通过 ulimit
命令设置生成 core 文件的最大大小:
ulimit -c unlimited
这将允许程序在崩溃时生成 core 文件。运行程序并发生崩溃后,可以使用以下命令:
gdb 程序名 core 文件名
例如,调试一个名为 my_program
的程序和它的 core 文件:
gdb my_program core
调试 core 文件时,首先可以使用 bt
命令查看函数调用栈,以便了解崩溃发生的位置:
bt
你还可以使用 print
命令查看崩溃时的变量值,以进一步分析问题所在。
GDB 也可以用于调试正在运行的程序。你可以附加到一个已经启动的进程,并实时调试它。
使用 attach
命令将 GDB 附加到一个正在运行的进程。例如,如果进程 ID 为 1234:
gdb
(gdb) attach 1234
这将使 GDB 附加到进程,接下来可以设置断点、查看变量等。
在调试正在运行的程序时,你可以在进程中的特定位置设置断点。例如:
(gdb) break main
这会在程序的 main
函数处设置断点。
使用 continue
或简称 c
命令,可以恢复程序的执行,直到遇到下一个断点为止:
continue