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 ## 改變記錄文件,默認(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 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, 循環(huán)

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

查看數(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=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

打印字符串士嚎,無(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子括细,更是在濱河造成了極大的恐慌伪很,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奋单,死亡現(xiàn)場(chǎng)離奇詭異锉试,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)辱匿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)键痛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人匾七,你說(shuō)我怎么就攤上這事絮短。” “怎么了昨忆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵丁频,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我邑贴,道長(zhǎng)席里,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任拢驾,我火速辦了婚禮奖磁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘繁疤。我一直安慰自己咖为,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布稠腊。 她就那樣靜靜地躺著躁染,像睡著了一般。 火紅的嫁衣襯著肌膚如雪架忌。 梳的紋絲不亂的頭發(fā)上吞彤,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音叹放,去河邊找鬼饰恕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛井仰,可吹牛的內(nèi)容都是我干的懂盐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼糕档,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼莉恼!你這毒婦竟也來(lái)了拌喉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俐银,失蹤者是張志新(化名)和其女友劉穎尿背,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捶惜,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡田藐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吱七。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汽久。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖踊餐,靈堂內(nèi)的尸體忽然破棺而出景醇,到底是詐尸還是另有隱情,我是刑警寧澤吝岭,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布三痰,位于F島的核電站,受9級(jí)特大地震影響窜管,放射性物質(zhì)發(fā)生泄漏散劫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一幕帆、第九天 我趴在偏房一處隱蔽的房頂上張望获搏。 院中可真熱鬧,春花似錦失乾、人聲如沸颜凯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蕾额,卻和暖如春早芭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诅蝶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工退个, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人调炬。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓语盈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缰泡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刀荒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 程序調(diào)試的基本思想是“分析現(xiàn)象->假設(shè)錯(cuò)誤原因->產(chǎn)生新的現(xiàn)象去驗(yàn)證假設(shè)”這樣一個(gè)循環(huán)過(guò)程,根據(jù)現(xiàn)象如何假設(shè)錯(cuò)誤原...
    Manfred_Zone閱讀 16,551評(píng)論 0 26
  • 一、GDB啟動(dòng) gdb官方在線幫助文檔 編譯選項(xiàng) 如果需要使用gdb缠借,在編譯代碼時(shí)需要先將調(diào)試開(kāi)關(guān)打開(kāi)干毅,對(duì)應(yīng)gcc...
    小小小_大大大閱讀 1,534評(píng)論 0 1
  • gdb是gcc的交互式調(diào)試器。 假設(shè)程序文件是a.c,內(nèi)容是(這個(gè)程序有錯(cuò)誤): #include int j; ...
    金石明鏡閱讀 961評(píng)論 0 1
  • 1. 幫助 選項(xiàng)作用help列出所有命令分類(lèi)help class列出分類(lèi)class中的命令列表help comma...
    RonZheng2010閱讀 1,854評(píng)論 0 0
  • 官方文檔 http://sourceware.org/gdb/current/onlinedocs/gdb/[ht...
    wayyyy閱讀 13,266評(píng)論 0 3