GNU DeBugger
GDB是linux下最主要的命令行调试工具。它的作用是协助程序员找到代码中的错误。如果没有GDB的帮助,程序员要想跟踪代码的执行流程,唯一的办 法就是添加大量的语句来产生特定的输出。但这一手段本身就可能会引入新的错误,从而也就无法对那些导致程序崩溃的错误代码进行分析。
GDB的出现减轻了开 发人员的负担,他们可以在程序运行的时候单步跟踪自己的代码,或者通过断点暂时中止程序的执行。此外,他们还能够随时察看变量和内存的当前状态,并监视关键的数据结构是如何影响代码运行的。
GDB主要提供4个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式、函数名、源文件的行号)
3、当程序被停住时,可以检查此时你的程序中所发生的事件。
4、动态的改变你程序的执行环境。
GDB调试命令
awatch | 指定一个变量,如果这个变量被读或者被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令。 |
backtrace | 查看栈信息。显示函数调用得所有栈框架(stack frames)的 踪迹和当前函数的参数的值,bt是这个命令的简写。 frame是堆栈中的一段,表示一个函数调用,每次函数调用,传递参数,局部变量等都保存在堆栈中,在一个函数的可见范围内,叫做一个frame,切换不同的frame,可以查看不同的局部变量和参数的值。 |
break | 设置一个断点,这个命令需要指定代码行或者函数名作为参数 break filename:linenum break filename:function break *address 在程序运行的内存地址上设置断点 设置条件断点: break linenum if expr |
clear | clear清除所有断点 clear <function> 清除设置在函数上的断点 clear <linenum>清除设置在指定行号的断点 |
continue | 调试器停止的地方继续执行 |
Ctrl-C | 在当前位置停止执行正在执行的程序,断点在当前行 |
disable | 禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数 |
display | 在断点的停止的地方,显示指定的表达式的值。(显示变量) |
enable | 允许断点功能,这个命令需要允许的断点在断点列表索引值作为参数 |
finish | 继续执行,直到当前函数返回 |
ignore | 忽略某个断点制定的次数。例:ignore 4 23 忽略断点4的23次运行,在第24次的时候中断 |
info breakpoints | 查看断点信息 |
info display | 查看设置的需要显示的表达式的信息 |
kill | 终止当前debug的进程 |
list | 显示10行代码。如果没有提供参数给这个命令,则从当前行开始显示10行代码。 |
load | 动态载入一个可执行文件到调试器。 |
next | 执行下一行的源代码的所有指令。如果是函数调用,不进入函数,执行到此函数返回 |
nexti | 执行下一行的源代码中的一条汇编指令 |
| 显示变量的值 |
ptype | 显示变量的类型 (对于结构体可查看其内部成员) |
return | 强制从当前函数返回 |
run | 从程序开始的地方执行 ,可以在此处给程序加上命令行参数 |
rwatch | 指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令。 |
set | 设置变量的值。例如:set variable nval=54 将把54保存到nval变量中 |
step | 继续执行程序下一行源代码的所有指令。如果是调用函数,这个命令将进入函数的内部,单步执行函数中代码。 |
stepi | 继续执行程序下一行源代码中的汇编指令。如果是函数调用,这个命令将进入函数的内部,单步执行函数中的汇编代码。 |
txbreak | 在当前函数的退出的点上设置一个临时的断点(只可使用一次)。 |
undisplay | 删除一个display设置的变量显示。这个命令需要将display list中的索引做参数。 |
watch | 指定一个变量,如果这个变量被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令。 |
whatis | 查看变量和函数的类型。 |
xbreak | 在当前函数的退出的点上设置一个断点。 |
设置断点
设置一个断点,这个命令需要指定代码行或者函数名作为参数
break filename:linenum 在指定行号上设置断点
break filename:function 在指定的函数入口处设置断点(重载函数???)
break *address 在程序运行的内存地址上设置断点
设置条件断点:
break linenum if expr
break funcname if expr
查看断点信息
Num 断点号
Type 断点类型
Disp 断点类型 del表示断点暂停1次后自动删除断点,dis表示断点暂停后关闭断点,keep表示断点暂停后继续保持断点
Enb表示断点是否启动(Enable)
Address表示断点的代码地址
What表示断点在源文件中的位置
关闭和启动断点
enable <breakpoint number>
disable <breakpoint number>
enable delete <breakpoint number>
enable once <breakpoint number>
查看变量
print /fmt <expr>
expr是任何合法的表达式
fmt 是格式定义,如下表:
x | 16进制 |
d | 10进制 |
u | 无符号格式 |
o | 8进制 |
t | 2进制 |
a | 用16进制格式打印地址 |
c | 字符格式 |
f | 浮点格式 |
查看内存
x /fmt <address>
address是任何合法的地址,如:
0x8799f00e (内存地址)
p (程序中的合法指针)
&var(程序中的合法变量)
fmt由三部分组成,NFU。
N表示查看的长度
F表示格式,与print命令的格式相同
U表示单位,可以是b(字节)、h(半字)、w(字)、g(双字)