gdb note

.gdbinit###

handle pass
handle nostop
set confirm off
set pagination off
set print pretty

set target-async 0

set scheduler-locking on

set non-stop off

.gdbinit###

define gobt

set logging file ~/gdblog ## 改变记录文件,默认记录文件是gdb.txt。

默认这个项目是关闭,

也就是以添加的形式将记录信息写入文件,这样之前文件中的信息不会被覆盖掉。

注意:如果设置这个选项的时候记录功能已经打开,需要关闭记录功能再重新打开才能起作用。

set logging overwrite off

set logging redirect on ## 设置输出信息只记录到文件不作显示。
set logging on
bt
set logging off
shell echo #Local Variables: # >> ~/gdblog
shell echo #mode: compilation # >> ~/gdblog
shell echo #End: # >> ~/gdblog
shell emacs -n ~/gdblog
end

define showmem
set DATA=arg0
set LEN=arg1
printf "%p:%d\n", DATA,LEN

set $COUNT=0
while ($COUNT < $LEN)
    printf "0x%02x ", *(unsigned char*)($DATA+$COUNT)
    set $COUNT=$COUNT+1
    if (0 == ($COUNT % 16))
        printf "\n"
    end
end

printf "\n"

end

p/x data@len
p/x data[0]@len
p/x *data@len

variable, 变量

set VAR=0 setVAR=$VAR+1

condition, 条件

if (10 < $VAR)
c
end

loop, 循环

while (VAR < obj.size) printf "%d/%d\n",VAR, obj.size
set VAR=VAR+1
end

-silent

gdb -args ./a.out -c -m -t
set args –b –x
show args
run <args>
cd
dir

查看数组的前5个值
p arr[0]@5

signal处理
handle pass
handle nostop

断点
break 46 if testsize==100
break csras_server/server.cpp:46
break 123
commands #默认是给最近定义的断点
silent
watch i
c
end

commands 2 #直接指定给哪一个断点
enable
c
end

clear server.cpp:123

tui模式
(cmd)command
(src)source
(asm)assembly
(reg)register
layout src
layout asm
layout split
winheight src +/-5
focus next/prev

gdb 调试跟踪多进程程序
gdb只能跟踪一个进程(默认是跟踪父进程),而不能同时跟踪多个进程,
可以设置gdb跟踪父进程还是子进程, 命令如下:
set follow-fork-mode parent 跟踪父进程, 默认
set follow-fork-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 <linenumber> 行号
  list <+offset> 当前行号的正偏移
  list <-offset> 当前行号的负偏移
  list <filename:linenumber> 哪个文件的哪一行
  list <function> 函数名
  list <filename:function> 文件的哪个函数
  list <*address> 程序运行时语句在内存中的地址

2.设置断点:break(b)
  break <function> 指定函数断点
  break <linenumber> 指定行号断点
  break <+offset/-offset> 当前行号的正/负偏移
  break <filename:linenumber> 哪个文件的哪一行
  break <*address> 运行中的内存地址
  break 不带参数,下一条指令停止处
  break ... if <condition> 在运行中,当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 <function>/<filename:function>/<linenum>/<filename:linenum>
清楚已定义的停止点
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=PID+1

while (PID <= 47) printf "thread %d",TID
thread PID btPID=$PID+1
end

打印所有线程的栈
set logging file <文件名>
set logging on
thread apply all bt
set logging off
quit

打印字符串,无省略
printf "%s\r\n", addr

默认编译的时候,调试过程是看不见宏的值的。编译时候需要给选项。-g3
gcc -g3 -o test.c test
察看宏(macro)命令: p macroname(...)
就像察看一个普通变量一样。如果只想看宏的展开形势,就用如下命令:
macro expand macroname(...) 查看展开形式
还可以用info macro macroname 查看宏定义。

保存断点到文件

save breakpoint outputfile

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 程序调试的基本思想是“分析现象->假设错误原因->产生新的现象去验证假设”这样一个循环过程,根据现象如何假设错误原...
    Manfred_Zone阅读 16,512评论 0 26
  • 一、GDB启动 gdb官方在线帮助文档 编译选项 如果需要使用gdb,在编译代码时需要先将调试开关打开,对应gcc...
    小小小_大大大阅读 1,505评论 0 1
  • gdb是gcc的交互式调试器。 假设程序文件是a.c,内容是(这个程序有错误): #include int j; ...
    金石明镜阅读 945评论 0 1
  • 1. 帮助 选项作用help列出所有命令分类help class列出分类class中的命令列表help comma...
    RonZheng2010阅读 1,824评论 0 0
  • 官方文档 http://sourceware.org/gdb/current/onlinedocs/gdb/[ht...
    wayyyy阅读 13,135评论 0 3