gdb [options] –args executable-file [inferior-arguments …] Note that breakpoints, GDB variables, command history etc. are not affected by restoring a checkpoint. In general, a checkpoint only restores things that reside in the program being debugged, not in the debugger.
p array[0]@100 打印数组前100个元素
p /x var 以16进制打印
break … if COND
call printf(“abcd”)
display /x addr
undisplay 1
set var varname = value
whatis varname //显示变量varname的类型,如double,int,…
set print pretty
set {int}0x83040 = 4 //向地址0x83040写入4
until 结束当前循环
ptype 显示一个数据结构(如一个结构或C++类)的内容
checkpoint
x /40xw 0x20000
x /10i 0x312000
disassemble 0xbff00800 0x10 :address:len
finish - Execute until selected stack frame returns
display /i $pc - 单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)
layout src:显示源代码窗口
layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口
Ctrl + L:刷新窗口
layout prev|next
focus src|asm|regs|cmd|prev|next
add-symbol-file
qemu控制终端输入gdbserver后
gdb -ex "target remote localhost:1234" -ex "layout split" -ex "symbol-file vmlinux"
gdbserver运行在目标机(板)上在调试机上运行gdb调试
同步调试:target remote …
异步调试:target async …
============================================================================================
http://sources.redhat.com/gdb/current/onlinedocs/gdb_5.html#SEC27
1.break FUNCTION
在某个函数上设置断点。函数重载时,有可能同时在几个重载的函数上设置了断点
break +OFFSET
break -OFFSET
在当前程序运行到的前几行或后几行设置断点
break LINENUM
在行号为LINENUM的行上设置断点
break FILENAME:LINENUM
在文件名为FILENAME的原文件的第LINENUM行设置断点
break FILENAME:FUNCTION
在文件名为FILENAME的FUNCTION函数上设置断点
当你的多个文件中可能含有相同的函数名时必须给出文件名。
break ADDRESS
在地址ADDRESS上设置断点,这个命令允许你在没有调试信息的程序中设置断点
break
当break命令不包含任何参数时,break命令在当前执行到的程序运行栈中的
下一条指令上设置一个断点。除了栈底以外,这个命令使程序在一旦从当前
函数返回时停止。相似的命令是finish,但finish并不设置断点。这一点在
循环语句中很有用。gdb在恢复执行时,至少执行一条指令。
break … if COND
这个命令设置一个条件断点,条件由COND指定;在gdb每次执行到此断点时
COND都被计算当COND的值为非零时,程序在断点处停止
ignore BNUM COUNT’
设置第BNUM号断点的被忽略的次数为’COUNT’,即断点BNUM再执行到第COUNT+1
次时程序停止
tbreak ARGS 或者简写为 tb
设置断点为只有效一次。ARGS的使用同break中的参量的使用
hbreak ARGS
设置一个由硬件支持的断点。这个命令的主要目的是用于对EPROM/ROM程序的调试
因为这条命令可以在不改变代码的情况下设置断点。这可以同SPARCLite DSU一起
使用。当程序访问某些变量和代码时,DSU将设置“陷井”。注意:你只能一次使用
一个断点,在新设置断点时,先删除原断点
thbreak ARGS’
设置只有一次作用的硬件支持断点
rbreak REGEX
在所有满足表达式REGEX的函数上设置断点。这个命令在所有相匹配的函数上设置无
条件断点,当这个命令完成时显示所有被设置的断点信息。这个命令设置的断点和
break命令设置的没有什么不同。当调试C++程序时这个命令在重载函数上设置断点时
非常有用。
info breakpoints [N]
info break [N]
info watchpoints [N]
显示所有的断点和观察点的设置表,有下列一些列
Breakpoint Numbers—-断点号
Type—-断点类型(断点或是观察点)
Disposition—显示断点的状态
Enabled or Disabled—使能或不使能。’y’表示使能,’n’表示不使能。
Address—-地址,断点在你程序中的地址(内存地址)
What—地址,断点在你程序中的行号。
如果断点是条件断点,此命令还显示断点所需要的条件。
带参数N的’info break’命令只显示由N指定的断点的信息。
此命令还显示断点的运行信息(被执行过几次),这个功能在使用’ignore’
命令时很有用。你可以’ignore’一个断点许多次。使用这个命令可以查看断点
被执行了多少次。这样可以更快的找到错误。
maint info breakpoints
显示所有的断点,无论是你设置的还是gdb自动设置的。
断点的含义:
breakpoint:断点,普通断点
watchpoint:普通观察点
longjmp:内部断点,用于处理’longjmp’调用
longjmp resume:内部断点,设置在’longjmp’调用的目标上
until:’until’命令所使用的内部断点
finish:finish’命令所使用的内部断点
2.watch EXPR
为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
这个命令使用EXPR作为表达式设置一个观察点。GDB将把表达式加入到程序中并监
视程序的运行,当表达式的值被改变时GDB就使程序停止。这个也可以被用在SPARClite
DSU提供的新的自陷工具中。当程序存取某个地址或某条指令时(这个地址在调试寄
存器中指定),DSU将产生自陷。对于数据地址DSU支持’watch’命令,然而硬件断点寄
存器只能存储两个断点地址,而且断点的类型必须相同。就是两个’rwatch’型断点
或是两个’awatch’型断点。
rwatch EXPR’
设置一个观察点,当EXPR被程序读时,程序被暂停。
awatch EXPR’
设置一个观察点,当EXPR被读出然后被写入时程序被暂停。
info watchpoints
在多线程的程序中,观察点的作用很有限,GDB只能观察在一个线程中的表达式的值
如果你确信表达式只被当前线程所存取,那么使用观察点才有效。GDB不能注意一个
非当前线程对表达式值的改变。
rwatch <expr>
当表达式(变量)expr被读时,停住程序。
awatch <expr>当表达式(变量)的值被读或被写时,停住程序。
info watchpoints
列出当前所设置了的所有观察点。3.cont N
第N次经过该断点时才停止程序运行
4.enable 断点编号
恢复暂时失活的断点,要恢复多个编号的断点,可用空格将编号分开
5.disable 断点编号
使断点失效,但是断点还在
6.delete 断点编号或者表达式
删除某断点
7.clear 断点所在行号
清除某断点
8.查看断点列表
info break9.watch counter>15
当counter>15的时候程序终止
10.当程序崩溃的时候linux会生成一个core文件,可以用
gdb a.out core
where
查看导致崩溃的原因
A Non-obvious Benefit of Using Checkpoints11.checkpoint
checkpoint
command takes no arguments, but each checkpoint is assigned a small integer id, similar to a breakpoint id. info checkpoints
Checkpoint ID
Process ID
Code Address
Source line, or label
restart checkpoint-id
delete checkpoint checkpoint-id
On some systems such as GNU/Linux, address space randomization is performed on new processes for security reasons. This makes it difficult or impossible to set a breakpoint, or watchpoint, on an absolute address if you have to restart the program, since the absolute location of a symbol will change from one execution to the next.
A checkpoint, however, is an identical copy of a process. Therefore if you create a checkpoint at (eg.) the start of main, and simply return to that checkpoint instead of restarting the process, you can avoid the effects of address randomization and your symbols will all stay in the same place.
GDB调试精粹及使用实例 来源:不详 (2006-07-14 11:18:05)
一:列文件清单
1. List
(gdb) list line1,line2
二:执行程序
要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<和>)和外壳通配符(、?、[、])在内。
如果你使用不带参数的run命令,gdb就再次使用你给予前一条run命令的参数,这是很有用的。
利用set args 命令就可以修改发送给程序的参数,而使用show args 命令就可以查看其缺省参数的列表。
(gdb) set args –b –x
(gdb) show args
backtrace命令为堆栈提供向后跟踪功能。
Backtrace 命令产生一张列表,包含着从最近的过程开始的所以有效过程和调用这些过程的参数。
三:显示数据
利用print 命令可以检查各个变量的值。
(gdb) print p (p为变量名)
whatis 命令可以显示某个变量的类型
(gdb) whatis p
type = int
print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:
l 对程序中函数的调用
(gdb) print find_entry(1,0)
l 数据结构和其他复杂对象
(gdb) print table_start
$8={e=reference=’