. gdbinit###
手持通路
handle nostop
设置确认关闭
设置页面关闭
设置打印保留
设置目标同步0
设置计划程序-锁定on
设置不停止关闭
. gdbinit###
定义gobt
设置日志文件~/GD blog # #更改日志文件,默认日志文件为gdb.txt。
默认情况下,此项目已关闭。
这意味着以附加形式将记录信息写入文件,以避免复盖以前文件中的信息。
注:如果在设置此选项时启用了日志记录功能,则必须关闭日志记录功能,然后才能正常工作。
设置记录关闭
set logging redirect on ##设定输出信息只记录在文件中不显示。
设置记录on
bt
设置记录关闭
壳牌echo # local variables : #~~/GD blog
外壳echo # mode : compilation #~~/GD blog
壳牌Echo#end:#~~/GDblog
外壳Emacs-n~~/GDblog
结束
定义显示
设置
arg0
设置
arg1
printf '%p:%dn ',
LEN
set $COUNT=0
while($count$len ) )。
printf '0xx ',* (未指定的char * ) ($DATA $COUNT ) () ) ) ) ) ) ) ) )。
set $COUNT=$COUNT 1
if(0==) $count )
printf 'n '
结束
结束
printf 'n '
结束
p/x data@len
p/x data[0]@len
p/x *data@len
变量,变量
设置
VAR=$VAR 1
条件,条件
是if(10$var )
C
结束
loop,循环
while (
VAR,obj.size
设置
VAR 1
结束
-silent
gdb -args ./a.out -c -m -t
setargsbx
show args
运行
cd
dir
显示数组的前五个值
p arr[0]@5
信号处理
手持通路
handle nostop
断点
break 46 if testsize==100
breakcsras _ server/server.CPP :46
break 123
commands #的默认值是最近定义的断点
智能手机
watch i
C
结束
commands 2 #直接分配给哪个断点
内布尔
C
结束
clear server.cpp:123
tui模式
(cmd )命令
(src ) source
(asm )组件
(reg )注册器
layout src
layout asm
布局剥离
winheight src /-5
focus next/prev
gdb调试跟踪多进程程序
gdb只能跟踪一个进程,默认情况下跟踪父进程。 不能同时跟踪多个进程。
可以设置gdb是跟踪父进程还是子进程。 命令为以下:
设置跟随模式父进程,默认值为
设置跟随-跟随-
mode child 跟踪子进程set scheduler-locking on # 多线程下禁止线程切换
set scheduler-locking off|on|step #估计是实际使用过多线程调试的人都可以发现,
#在使用step或者continue命令调试当前被调试线程的时候,
#其他线程也是同时执行的,怎么只让被调试程序执行呢?
#通过这个命令就可以实现这个需求。
#off 不锁定任何线程,也就是所有线程都执行,这是默认值。
#on 只有当前被调试程序会执行。
#step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,
#这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。
break test.c:123 thread all # 在所有线程中相应的行上设置断点
thread apply ID1 ID2 command # 让一个或者多个线程执行GDB命令command。
thread apply all command # 让所有被调试线程执行GDB命令command
set target-async 1 # 异步模式
set pagination off
set non-stop on
设置core环境
uname -a 查看机器参数
ulimit -a 查看默认参数
ulimit -c 1024 设置core文件大小为1024
ulimit -c unlimit 设置core文件大小为无限
帮助
help xxx
apropos xxx
跳转
jump 5
j 123
需要注意的是,跳转到第5行执行完毕之后,如果后面没有断点则继续执行,而并不是停在那里了。
可配合tbreak使用。
执行N次下一步
next N
util N
检测表达式变化则停住
watch i != 10
这里,i != 10这个表达式一旦变化,则停住。watch 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序(也是一种断点)。
rwatch 当expr被读时,停住程序。
awatch 当expr被读或被写时,停住程序。
监视指定内存
p &(s_packet->data)
$10 = (const uint8_t **) 0x7fffec0015d8
awatch (uint8_t)0x7fffec0015d8
info frame 查看当前函数的程序语言
info source 显示当前的调试源文件
whatis var 显示一个变量var的类型
kill 终止一个正在调试的程序
whatis var 显示一个变量var的类型
ptype var 以更详细的方式显示变量var的类型,这里,会打印出var的结构定义
print x=4 修改运行时候的变量值
备常用命令:
1.常看源码:list(l)
list 行号
list 当前行号的正偏移
list 当前行号的负偏移
list 哪个文件的哪一行
list 函数名
list 文件的哪个函数
list 程序运行时语句在内存中的地址
2.设置断点:break(b)
break 指定函数断点
break 指定行号断点
break 当前行号的正/负偏移
break 哪个文件的哪一行
break 运行中的内存地址
break 不带参数,下一条指令停止处
break ... if 在运行中,当condition条件满足时停止。
eg. break if i=100 //当i=100时,立即停止
break foo if i=100 //断点设置在foo中,断点条件是i-100, 一点在函数foo中,i的值等于100,被停止。
3.查看信息:info
info break 查看断点信息
info locals 打印出当前函数中所有局部变量及其值
info stack 查看栈中信息
info frame 更详细的栈层地址信息
info args 查看参数信息
info registers/info all-registers 查看(所有)寄存器信息
info sources 查看项目的源代码信息
4.维护breakpoint:disable/enable/clear/delete
disable(dis) 【breakpoints】 【range...】
如果没有参数,则停止所有的断点,
enable 【breakpoints】【range】
clear ///
清楚已定义的停止点
delete [breakpoints] [ranga...]
删除指定的断点
以下是list命令的說明。
參數 說明
list filename:number 列出某檔案的第幾行,檔案是可省略的。
list [function] 列出某函數的程式碼
list 繼續印出程式碼
list - 印出上一次list的程式碼的前一段程式碼(類似向上翻動)
show listsize 顯示現在一次印出幾行
set listsize 設定一次印出幾行
查看文件中某变量的值
file::variable
function::variable
可以通过这种形式指定你所想查看的变量,是哪个文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:
gdb) p 'f2.c'::x
如果a是一个数组,10个元素,如果要显示则:
(gdb) print *a@10
这样,会显示10个元素,无论a是double或者是int的都会正确地显示10个元素。
用16进制显示(var)值
print /x var
这里可以知道,print可以指定显示的格式,这里用'/x'表示16进制的格式。
可以支持的变量显示格式有:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
如果a是一个数组,10个元素,如果要显示则:
print *a@10
p a[0]@10
print /x var
这里可以知道,print可以指定显示的格式,这里用'/x'表示16进制的格式。
可以支持的变量显示格式有:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
循环
set $PID=1
PID+1
while (
TID
thread
PID=$PID+1
end
打印所有线程的栈
set logging file
set logging on
thread apply all bt
set logging off
quit
打印字符串,无省略
printf "%srn", addr
默认编译的时候,调试过程是看不见宏的值的。编译时候需要给选项。-g3
gcc -g3 -o test.c test
察看宏(macro)命令: p macroname(...)
就像察看一个普通变量一样。如果只想看宏的展开形势,就用如下命令:
macro expand macroname(...) 查看展开形式
还可以用info macro macroname 查看宏定义。
保存断点到文件
save breakpoint outputfile