GDB调试
什么是GDB
- GDB 是自由软件基金会(Free Software Foundation)的软件工具之一。它的作用是协助程序员找到代码中的错误。如果没有GDB的帮助,程序员要想跟踪代码的执行流程,唯一的办法就是添加大量的语句来产生特定的输出。但这一手段本身就可能会引入新的错误,从而也就无法对那些导致程序崩溃的错误代码进行分析。
- GDB的出现减轻了开发人员的负担,他们可以在程序运行的时候单步跟踪自己的代码,或者通过断点暂时中止程序的执行。此外,他们还能够随时察看变量和内存的当前状态,并监视关键的数据结构是如何影响代码运行的。
如何进行GDB调试
gcc -g debugme.c -o debugme
产生debugme文件
gdb debugme
- 如果一切正常,GDB将被启动并在屏幕上输出版权信息,但如果使用了-q或–quiet选项则不会显示它们。启动GDB时另外一个有用的命令行选项是“-d dirname”,其中dirname是一个目录名。该目录名告诉GDB应该到哪里去寻找源代码。
- 一旦出现GDB的命令提示符(gdb),就表明GDB已经准备好接收来自用户的各种调试命令了。如果想在调试环境下运行这个程序,可以使用GDB提供的 “run”命令,而程序在正常运行时所需的各种参数可以作为“run”命令的参数传入,或者使用单独的“set args”命令进行设置。如果在执行“run”命令时没有给出任何参数,GDB将使用上一次“run”或“set args”命令指定的参数。如果想取消上次设置的参数,可以执行不带任何参数的“set args”命令。
(gdb)run … - 一些GDB调试的基本参数
命令 | 缩写 | 命令缩写 |
---|---|---|
list | l | 显示多行源代码 |
break | b | 设置断点,程序运行到断点的位置会停下来 |
info | i | 描述程序的状态 |
run | r | 开始运行程序 |
display | disp | 跟踪查看某个变量,每次停下来都显示它的值 |
step | s | 执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句 |
next | n | 执行下一条语句,不进入函数内部 |
p | 打印内部变量值 | |
continue | c | 程序继续运行,直到遇见下一个断点 |
set var name=v | 设置变量的值 | |
start | st | 开始执行程序,在main函数的第一条语句前面停下来 |
file | 装入需要调试的程序 | |
kill | k | 终止正在调试的程序 |
watch | 监视变量值的变化 | |
backtrace | bt | 查看函数调用信息(堆栈) |
frame | f | 查看栈帧 |
quit | q | 退出GDB环境 |
- 调试示例:
list //先显示多行代码,观察需要设置断点处的行号
break linenum //再在需要设置断点处的行号下设置断点
run //将程序直接运行到断点处
step //进入断点处的函数,执行其中的第一条语句
next //下一步,不进入函数内部
print var //显示变量var的值
break 25 if num == 1 //如果num的值为1,则在第25行设置一个断点,这为条件断点
whatis str //观察str是什么类型的变量
delete 25 //删除在25行处的断点
continue //继续执行程序,直到遇见下一个断点