.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 ## 改變記錄文件,默認(rèn)記錄文件是gdb.txt诉瓦。
默認(rèn)這個(gè)項(xiàng)目是關(guān)閉厉熟,
也就是以添加的形式將記錄信息寫(xiě)入文件邦危,這樣之前文件中的信息不會(huì)被覆蓋掉誉券。
注意:如果設(shè)置這個(gè)選項(xiàng)的時(shí)候記錄功能已經(jīng)打開(kāi)让网,需要關(guān)閉記錄功能再重新打開(kāi)才能起作用芝硬。
set logging overwrite off
set logging redirect on ## 設(shè)置輸出信息只記錄到文件不作顯示对碌。
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 arg0
set arg1
printf "%p:%d\n", 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=$VAR+1
condition, 條件
if (10 < $VAR)
c
end
loop, 循環(huán)
while (VAR, obj.size
set VAR+1
end
-silent
gdb -args ./a.out -c -m -t
set args –b –x
show args
run <args>
cd
dir
查看數(shù)組的前5個(gè)值
p arr[0]@5
signal處理
handle pass
handle nostop
斷點(diǎn)
break 46 if testsize==100
break csras_server/server.cpp:46
break 123
commands #默認(rèn)是給最近定義的斷點(diǎn)
silent
watch i
c
end
commands 2 #直接指定給哪一個(gè)斷點(diǎn)
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 調(diào)試跟蹤多進(jìn)程程序
gdb只能跟蹤一個(gè)進(jìn)程(默認(rèn)是跟蹤父進(jìn)程)事期,而不能同時(shí)跟蹤多個(gè)進(jìn)程滥壕,
可以設(shè)置gdb跟蹤父進(jìn)程還是子進(jìn)程, 命令如下:
set follow-fork-mode parent 跟蹤父進(jìn)程, 默認(rèn)
set follow-fork-mode child 跟蹤子進(jìn)程
set scheduler-locking on # 多線程下禁止線程切換
set scheduler-locking off|on|step #估計(jì)是實(shí)際使用過(guò)多線程調(diào)試的人都可以發(fā)現(xiàn),
#在使用step或者continue命令調(diào)試當(dāng)前被調(diào)試線程的時(shí)候兽泣,
#其他線程也是同時(shí)執(zhí)行的绎橘,怎么只讓被調(diào)試程序執(zhí)行呢?
#通過(guò)這個(gè)命令就可以實(shí)現(xiàn)這個(gè)需求撞叨。
#off 不鎖定任何線程金踪,也就是所有線程都執(zhí)行浊洞,這是默認(rèn)值。
#on 只有當(dāng)前被調(diào)試程序會(huì)執(zhí)行胡岔。
#step 在單步的時(shí)候法希,除了next過(guò)一個(gè)函數(shù)的情況(熟悉情況的人可能知道,
#這其實(shí)是一個(gè)設(shè)置斷點(diǎn)然后continue的行為)以外靶瘸,只有當(dāng)前線程會(huì)執(zhí)行苫亦。
break test.c:123 thread all # 在所有線程中相應(yīng)的行上設(shè)置斷點(diǎn)
thread apply ID1 ID2 command # 讓一個(gè)或者多個(gè)線程執(zhí)行GDB命令command。
thread apply all command # 讓所有被調(diào)試線程執(zhí)行GDB命令command
set target-async 1 # 異步模式
set pagination off
set non-stop on
設(shè)置core環(huán)境
uname -a 查看機(jī)器參數(shù)
ulimit -a 查看默認(rèn)參數(shù)
ulimit -c 1024 設(shè)置core文件大小為1024
ulimit -c unlimit 設(shè)置core文件大小為無(wú)限
幫助
help xxx
apropos xxx
跳轉(zhuǎn)
jump 5
j 123
需要注意的是怨咪,跳轉(zhuǎn)到第5行執(zhí)行完畢之后屋剑,如果后面沒(méi)有斷點(diǎn)則繼續(xù)執(zhí)行,而并不是停在那里了诗眨。
可配合tbreak使用唉匾。
執(zhí)行N次下一步
next N
util N
檢測(cè)表達(dá)式變化則停住
watch i != 10
這里,i != 10這個(gè)表達(dá)式一旦變化匠楚,則停住巍膘。watch 為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí)芋簿,馬上停住程序(也是一種斷點(diǎn))峡懈。
rwatch 當(dāng)expr被讀時(shí),停住程序与斤。
awatch 當(dāng)expr被讀或被寫(xiě)時(shí)肪康,停住程序。
監(jiān)視指定內(nèi)存
p &(s_packet->data)
$10 = (const uint8_t **) 0x7fffec0015d8
awatch (uint8_t)0x7fffec0015d8
info frame 查看當(dāng)前函數(shù)的程序語(yǔ)言
info source 顯示當(dāng)前的調(diào)試源文件
whatis var 顯示一個(gè)變量var的類(lèi)型
kill 終止一個(gè)正在調(diào)試的程序
whatis var 顯示一個(gè)變量var的類(lèi)型
ptype var 以更詳細(xì)的方式顯示變量var的類(lèi)型,這里撩穿,會(huì)打印出var的結(jié)構(gòu)定義
print x=4 修改運(yùn)行時(shí)候的變量值
備常用命令:
1.沉字В看源碼:list(l)
list <linenumber> 行號(hào)
list <+offset> 當(dāng)前行號(hào)的正偏移
list <-offset> 當(dāng)前行號(hào)的負(fù)偏移
list <filename:linenumber> 哪個(gè)文件的哪一行
list <function> 函數(shù)名
list <filename:function> 文件的哪個(gè)函數(shù)
list <*address> 程序運(yùn)行時(shí)語(yǔ)句在內(nèi)存中的地址
2.設(shè)置斷點(diǎn):break(b)
break <function> 指定函數(shù)斷點(diǎn)
break <linenumber> 指定行號(hào)斷點(diǎn)
break <+offset/-offset> 當(dāng)前行號(hào)的正/負(fù)偏移
break <filename:linenumber> 哪個(gè)文件的哪一行
break <*address> 運(yùn)行中的內(nèi)存地址
break 不帶參數(shù),下一條指令停止處
break ... if <condition> 在運(yùn)行中冗锁,當(dāng)condition條件滿足時(shí)停止齐唆。
eg. break if i=100 //當(dāng)i=100時(shí),立即停止
break foo if i=100 //斷點(diǎn)設(shè)置在foo中冻河,斷點(diǎn)條件是i-100, 一點(diǎn)在函數(shù)foo中箍邮,i的值等于100,被停止。
3.查看信息:info
info break 查看斷點(diǎn)信息
info locals 打印出當(dāng)前函數(shù)中所有局部變量及其值
info stack 查看棧中信息
info frame 更詳細(xì)的棧層地址信息
info args 查看參數(shù)信息
info registers/info all-registers 查看(所有)寄存器信息
info sources 查看項(xiàng)目的源代碼信息
4.維護(hù)breakpoint:disable/enable/clear/delete
disable(dis) 【breakpoints】 【range...】
如果沒(méi)有參數(shù)叨叙,則停止所有的斷點(diǎn)锭弊,
enable 【breakpoints】【range】
clear <function>/<filename:function>/<linenum>/<filename:linenum>
清楚已定義的停止點(diǎn)
delete [breakpoints] [ranga...]
刪除指定的斷點(diǎn)
以下是list命令的說(shuō)明。
參數(shù) 說(shuō)明
list filename:number 列出某檔案的第幾行擂错,檔案是可省略的味滞。
list [function] 列出某函數(shù)的程式碼
list 繼續(xù)印出程式碼
list - 印出上一次list的程式碼的前一段程式碼(類(lèi)似向上翻動(dòng))
show listsize 顯示現(xiàn)在一次印出幾行
set listsize 設(shè)定一次印出幾行
查看文件中某變量的值
file::variable
function::variable
可以通過(guò)這種形式指定你所想查看的變量,是哪個(gè)文件中的或是哪個(gè)函數(shù)中的。例如剑鞍,查看文件f2.c中的全局變量x的值:
gdb) p 'f2.c'::x
如果a是一個(gè)數(shù)組昨凡,10個(gè)元素,如果要顯示則:
(gdb) print *a@10
這樣蚁署,會(huì)顯示10個(gè)元素便脊,無(wú)論a是double或者是int的都會(huì)正確地顯示10個(gè)元素。
用16進(jìn)制顯示(var)值
print /x var
這里可以知道光戈,print可以指定顯示的格式哪痰,這里用'/x'表示16進(jìn)制的格式。
可以支持的變量顯示格式有:
x 按十六進(jìn)制格式顯示變量久妆。
d 按十進(jìn)制格式顯示變量晌杰。
u 按十六進(jìn)制格式顯示無(wú)符號(hào)整型。
o 按八進(jìn)制格式顯示變量筷弦。
t 按二進(jìn)制格式顯示變量肋演。
a 按十六進(jìn)制格式顯示變量。
c 按字符格式顯示變量烂琴。
f 按浮點(diǎn)數(shù)格式顯示變量惋啃。
如果a是一個(gè)數(shù)組,10個(gè)元素监右,如果要顯示則:
print *a@10
p a[0]@10
print /x var
這里可以知道,print可以指定顯示的格式异希,這里用'/x'表示16進(jìn)制的格式健盒。
可以支持的變量顯示格式有:
x 按十六進(jìn)制格式顯示變量。
d 按十進(jìn)制格式顯示變量称簿。
u 按十六進(jìn)制格式顯示無(wú)符號(hào)整型扣癣。
o 按八進(jìn)制格式顯示變量。
t 按二進(jìn)制格式顯示變量憨降。
a 按十六進(jìn)制格式顯示變量父虑。
c 按字符格式顯示變量。
f 按浮點(diǎn)數(shù)格式顯示變量授药。
循環(huán)
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
打印字符串士嚎,無(wú)省略
printf "%s\r\n", addr
默認(rèn)編譯的時(shí)候,調(diào)試過(guò)程是看不見(jiàn)宏的值的悔叽。編譯時(shí)候需要給選項(xiàng)莱衩。-g3
gcc -g3 -o test.c test
察看宏(macro)命令: p macroname(...)
就像察看一個(gè)普通變量一樣。如果只想看宏的展開(kāi)形勢(shì)娇澎,就用如下命令:
macro expand macroname(...) 查看展開(kāi)形式
還可以用info macro macroname 查看宏定義笨蚁。
保存斷點(diǎn)到文件
save breakpoint outputfile