编译
-g
-ggdb更多调试信息
不要用-O,加-O后编译器会做优化,导致程序和二进制代码之间关系变得复杂,给调试带来不必要的麻烦
启动
gdb executable core 分析core文件
gdb executable pid
gdb --pid=PID attach到一个运行中的进程
-d dir 到指定目录找源代码
-q 不打印乱七八糟信息
STL支持
通过.gdbinit 进行支持,见
help pvector,help pmap 查看使用方式
启动后的使用
l test.cpp:3,5显示test.cpp 的3到5行代码
list –显示前面的代码 list+显示后面的代码 list +offset
file FILE 装入想要调试的executable
n(ext line)
s(tep into) step进去后,如果想出来,可以用down回到上一层的位置然后用n继续
whatis variable 查看变量的类型,ptype可以看到更加完整的定义
info 命令查看各种信息,help info可以看到很多。常用的info thread, info breakpoints,再如info sharedlibrary, info stack
up和down命令,在函数调用栈中遍历,frame可以查看当前的栈(上下文),也可以用 f NUM 在各个栈之间切换,NUM的取值范围来自info stack
attach PID,这个效果和启动gdb --pid PID效果一样,用来调试一个正在运行的进程。detach 断开调试
kill 终止正在
show 命令,使用可以用help show看,比如show args
until 跳出当前的循环或者调用栈,跳出调用栈的时候类似down
info locals 当前栈内的局部变量
stepi单条机器指令
nexti单条机器指令
break
break [LOCATION] [thread THREADNUM] [if CONDITION]
break FILE:LINE
break 38 if count==3 count
disable NUM 取消第几个断点
info breakpoints 的输出含义
`Number'
number of the breakpoint
`Type'
type of the breakpoint: `breakpoint' or `watchpoint'
`Disposition'
should the breakpoint be deleted or disabled when it is hit: `keep' or `nokeep'
`Enabled'
is the breakpoint enabled or no: `y' or `n'
`Address'
memory location at which the breakpoint is set
`What'
logical location of the breakpoint, expressed by function name, file name, line number
`times'
number of times the breakpoint has been hit
watch
A watchpoint stops execution of your program whenever the value of an expression changes.
类似的还有rwatch、awatch
可以通过info watchpoints查看
print variable@NUM 查看variable,以及后面NUM个数值
可以打印寄存器的取值有哪些寄存器可以使用info all-registers 看
比如print $rax
查找
在代码中查找
search
reverse-search
clear
Clear breakpoint at specified line or function.
Argument may be line number, function name, or "*" and an address.
If line number is specified, all breakpoints in that line are cleared.
If function is specified, breakpoints at beginning of function are cleared.
If an address is specified, breakpoints at that address are cleared.
With no argument, clears all breakpoints in the line that the selected frame
is executing in.
特殊
某些时候,用 -g 编译过后的执行程序中只是包括了源文件的名字,没有路径名。 GDB 提供了可以让你指定源文件的路径的命令,以便 GDB 进行搜索。
directory <dirname ... >
dir <dirname ... >
加一个源文件路径到当前路径的前面。如果你要指定多个路径, UNIX 下你可以使用 “ : ”
show directories
print的特定输出格式
一般来说, GDB 会根据变量的类型输出变量的值。但你也可以自定义 GDB 的输出的格式。例如,你想输出一个整
数的十六进制,或是二进制来查看这个整型变量的中的位的情况。要做到这样,你可以使用 GDB 的数据显示格式:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101
自动显示
你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的 GDB 命令是
display 。
display <expr>
display/<fmt> <expr>
display/<fmt> <addr>
expr 是一个表达式, fmt 表示显示的格式, addr 表示内存地址,当你用 display 设定好了一个或多个表达式后,只要你的程序被停下来, GDB 会自动显示你所设置的这些表达式的值。格式 i 和 s 同样被 display 支持,一个非常有用的命令是:
display/i $pc
$pc 是 GDB 的环境变量,表示着指令的地址, /i 则表示输出格式为机器指令码,也就是汇编。于是当程序停下后,就会出现源代码和机器指令码相对应的情形,这是一个很有意思的功能。
下面是一些和 display 相关的 GDB 命令:
undisplay <dnums...>
delete display <dnums...>
删除自动显示, dnums 意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如: 2-5 )
disable display <dnums...>
enable display <dnums...>
disable 和 enalbe 不删除自动显示的设置,而只是让其失效和恢复。
info display
查看 display 设置的自动显示的信息。 GDB 会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,设置的编号,表达式,是否 enable
所有功能都可以通过下面的方式获得
(gdb) help
List of classes of commands: gdb的命令可以分为一下几类
aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands
Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.
每一个类的所有命令只要”help 类名”就可以看到。比如:
(gdb) help running
Running the program.
List of commands:
advance -- Continue the program up to the given location (same form as args for break command)
attach -- Attach to a process or file outside of GDB
continue -- Continue program being debugged
detach -- Detach a process or file previously attached
detach checkpoint -- Detach from a fork/checkpoint (experimental)
disconnect -- Disconnect from a target
finish -- Execute until selected stack frame returns
handle -- Specify how to handle a signal
interrupt -- Interrupt the execution of the debugged program
jump -- Continue program being debugged at specified line or address
kill -- Kill execution of program being debugged
next -- Step program
nexti -- Step one instruction
run -- Start debugged program
signal -- Continue program giving it signal specified by the argument
start -- Run the debugged program until the beginning of the main procedure
step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly
target -- Connect to a target machine or process
target async -- Use a remote computer via a serial line
target child -- Unix child process (started by the "run" command)
target core -- Use a core file as a target
target exec -- Use an executable file as a target
target extended-async -- Use a remote computer via a serial line
target extended-remote -- Use a remote computer via a serial line
target multi-thread -- Threads and pthreads support
target remote -- Use a remote computer via a serial line
thread -- Use this command to switch between threads
thread apply -- Apply a command to a list of threads
thread apply all -- Apply a command to all threads
until -- Execute until the program reaches a source line greater than the current
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)
breakpoint 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
commands 命中断点时,列出将要执行的命令
continue 从断点开始继续执行
delete 删除一个断点或监测点;也可与其他命令一起使用
display 程序停止时显示变量和表达时
down 下移栈帧,使得另一个函数成为当前函数
frame 选择下一条continue命令的帧
info 显示与该程序有关的各种信息
jump 在源程序中的另一点开始运行
kill 异常终止在gdb 控制下运行的程序
list 列出相应于正在执行的程序的原文件内容
next 执行下一个源程序行,从而执行其整体中的一个函数
print 显示变量或表达式的值
pwd 显示当前工作目录
pype 显示一个数据结构(如一个结构或C++类)的内容
quit 退出gdb
reverse-search 在源文件中反向搜索正规表达式
run 执行该程序
search 在源文件中搜索正规表达式
set variable 给变量赋值
signal 将一个信号发送到正在运行的进程
step 执行下一个源程序行,必要时进入下一个函数
undisplay display命令的反命令,不要显示表达式
until 结束当前循环
up 上移栈帧,使另一函数成为当前函数
watch 在程序中设置一个监测点(即数据断点)
whatis 显示变量或函数类型
****************************************************