一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Debugging with GDB學(xué)習(xí)記錄(一)

 娛天樂 2014-06-30

最近使用GDB調(diào)試程序,所以閱讀了《Debugging with GDB》一書,略作記錄,如需仔細(xì)研究使用,建議仍閱讀英文版書籍或MAN手冊


調(diào)試器,比如GDB,的目的就是用于查看運行中的程序的執(zhí)行流程以及環(huán)境、變量等情況。GDB主要可以工作于四種事情:
1、啟動程序,并指定影響程序行為的操作
2、讓程序在特定情況下停止
3、當(dāng)程序停止時,檢查發(fā)生情況
4、Change things in your program,從而可以矯正bug,并解決下一個bug


啟動GDB
1、在命令行上鍵入gdb
可以為gdb命令配置參數(shù)、選項以更好的配置調(diào)試環(huán)境
2、gdb program-name
3、gdb program-name core-file
   需要一個fairly complete os,但很難有方法來獲得core dumps,如果gdb無法attach或讀core dumps時,GDB會給出警告
4、gdb program-name pid   
   可以調(diào)試正在運行中的進(jìn)程
5、gdb --args gcc -O2 -c foo.c
   gdb可以使用--args,用于向可執(zhí)行文件傳遞參數(shù)。本例用于調(diào)試gcc,并設(shè)置gcc命令行參數(shù)為-O2 -c foo.c
6、gdb -silent
   啟動gdb時不會顯示一些版本等信息
給定的參數(shù)和選項會被順序處理,而使用-x選項后,就不同了。


選擇文件
GDB在讀取命令行參數(shù)時,如果沒有指定如下選項,會認(rèn)為第一個參數(shù)是可執(zhí)行程序(與指定-se類似),第二個參數(shù)是進(jìn)程ID或core dump文件,
如果以數(shù)字開頭則認(rèn)為是pid文件,如果某個core dump文件以數(shù)字開頭,應(yīng)當(dāng)轉(zhuǎn)義:加上‘./’前綴,例如'./12345'
1、-symbols file      -s file
   從file文件中讀取符號表symbol table
2、-exec file         -e file
   指定可執(zhí)行文件file
3、-se file  
   從file中讀取符號表并把file作為可執(zhí)行文件
4、-core file         -c file
   指定core dump文件file
5、-pid number        -p number
   將gdb attach到進(jìn)程pid
6、-command file      -x file
   從file文件中執(zhí)行命令
7、-eval-command command  -ex command
   執(zhí)行一single GDB命令,該選項可被多次使用來調(diào)用符合命令,也可以與'-command'混合使用,如:
   gdb -ex 'target sim' -ex 'load' -x setbreakpoints -ex 'run' a.out
8、-directory directory  -d directory
   在path中增加查找源文件和腳本文件的目錄
9、-r    -readnow
   立即讀取每個符號文件中的全部符號表,而不是默認(rèn)處理方式(增量讀?。?。


選擇模式:
1、-nx     -n
   不要執(zhí)行任何initialization file文件中的任何命令,一般情況下,GDB執(zhí)行完命令選項和參數(shù)后會執(zhí)行這些文件中的命令
2、-quiet -silent -q
   不要打印介紹和版權(quán)信息
3、-batch
   在批處理模式下運行,在執(zhí)行完-x指定文件中的所有內(nèi)容后,返回0,如果有錯誤發(fā)生,則返回非0
4、-batch-silent
   批處理和靜默模式,所有到stdout的GDB輸出都被禁止。
5、-return-child-result
   GDB返回值是被調(diào)式的子進(jìn)程的返回值,以下情況例外:
   (1)、GDB非正常停止,這時的返回值,跟沒有使用該選項一樣;
   (2)、使用者使用明確的值離開gdb,如'quit 1'
   (3)、子進(jìn)程沒有運行或者不允許停止,這種情況下返回值一般會是-1;
   當(dāng)GDB用于remote program loader或simulator interface時,與'-batch'或'-batch-silent'聯(lián)合使用方便。
6、-nowindows  -nw
   如果GDB有GUI,則該選項讓GDB僅使用命令行接口,如果沒有GUI,則該選項沒用。
7、-windows   -w
   如果GDB有GUI,則該選項讓GDB如果可能則可以使用GUI
8、-cd directory
   將該directory作為GDB的工作目錄
9、-data-directory directory
   使用該directory作為GDB的數(shù)據(jù)目錄,該目錄是GDB查找其輔助文件的地方
10、-fullname   -f
    GNU Emacs將GDB作為subprocess運行時,設(shè)置此選項。每次顯示一個棧幀時,它命令GDB輸出全部文件名以及行號。
    以兩個'\032':文件名:行號:字符位置,下面跟一新行形式顯示。
11、-epoch
   Epoch Emacs-GDB接口在將GDB運行為subprocess時設(shè)置該選項,讓GDB修改打印程序,來允許Epoch在一個單獨的窗口中顯示表達(dá)式的值。
12、-annotate level
   設(shè)置GDB內(nèi)部的annotation級別,這個基本決定了:GDB輸出多少提示信息,如:表達(dá)式值、源文件行數(shù)等等
   Level 0:normal;   Level 1:用于GDB作為GNU Emacs子進(jìn)程運行;  Level 3:是控制GDB程序所能用的最大級別; Level 2:不用
   這個annotation技術(shù)現(xiàn)已被GDB/MI取代
13、--args
   使得可執(zhí)行文件之后的參數(shù)是作為可執(zhí)行文件的輸入?yún)?shù)使用
14、-baud bps   -b bps
    通過串口,使用GDB遠(yuǎn)程調(diào)試時,設(shè)置串口波特率
15、-l timeout
    遠(yuǎn)程調(diào)試時,設(shè)置GDB通信的超時時間(單位:秒)
16、-tty device     -t device
    指定程序標(biāo)準(zhǔn)輸入和輸出使用的設(shè)備
17、 -tui
    啟動時激活Text User Interface接口。TUI接口管理終端上的多個文本窗口,顯示:源、匯編、寄存器和GDB命令輸出信息。
    也可以使用'gdbtui'程序,在從Emacs中運行GDB時不用該選項。
18、-interpreter interp
    使用解釋器interp作為與控制程序或設(shè)備的接口?!?-interpreter=mi’使GDB使用GDB/MI接口
19、-write
    以讀寫方式打開可執(zhí)行文件和core文件,功效同:GDB內(nèi)的‘set write on’。
20、-statistics
    當(dāng)GDB執(zhí)行完任一個命令并返回輸入時,打印關(guān)于time和內(nèi)存使用情況的統(tǒng)計信息。
21、-version
    版本信息


GDB啟動時做了什么?
1、設(shè)置命令解釋器;
2、讀取system-wide init file(如果編譯GDB時使用了'--with-system-gdbinit')并執(zhí)行該文件內(nèi)所有命令;
3、讀取用戶home目錄下的init文件并執(zhí)行該文件內(nèi)所有命令(if any);
4、處理命令行選項和操作;
5、讀取并執(zhí)行當(dāng)前工作目錄下init文件中的命令(if any),僅在當(dāng)前目錄并非用戶home目錄時執(zhí)行;
6、如果命令行執(zhí)行可執(zhí)行文件、或進(jìn)程ID或core文件,則GDB為該程序或其共享庫加載auto-loaded scripts
   如果不想啟動時自動加載,則執(zhí)行$gdb -ex "set auto-load-scripts off" -ex "file myprogram"
   而下面這個命令則不起作用,因為auto-loading被關(guān)閉時已經(jīng)晚了:$gdb -ex "set auto-load-scripts off" myprogram


7、讀取-x指定的命令文件
8、讀取history文件中記錄的歷史命令


init文件使用命令行文件相同的語法,并以相同方式處理。在用戶home目錄里的init文件可以設(shè)置選項影響后續(xù)命令行選項及操作的處理,
如果設(shè)置了-nx選項,則init file不會執(zhí)行。


為顯示gdb啟動時加載的init file列表,可執(zhí)行g(shù)db --help
GDB init files are normally called '.gdbinit'。GDB的DJGPP port使用'gdb.ini'名字


離開GDB
quit [expression]      q或者Ctrl-d
如果是Ctrl-c無法從GDB中離開,它的作用僅僅是停止GDB中某個正在執(zhí)行的GDB命令的停止。如果是attach process或device,可以通過
detach命令來釋放之。


Shell命令
如果想在調(diào)試時執(zhí)行shell命令,不必離開或掛起GDB
shell command string即可,如下所示:
(gdb) shell ls
apr-1.4.5-1.x86_64.rpm      ganglia-devel-3.2.0-1.x86_64.rpmganglia-gmond-modules-python-3.2.0-1.x86_64.rpm
apr-debuginfo-1.4.5-1.x86_64.rpm      ganglia-gmetad-3.2.0-1.x86_64.rpmlibganglia-3.2.0-1.x86_64.rpm
apr-devel-1.4.5-1.x86_64.rpm      ganglia-gmetad-python-3.2.0-1.x86_64.rpm
ganglia-debuginfo-3.2.0-1.x86_64.rpm  ganglia-gmond-3.2.0-1.x86_64.rpm
環(huán)境變量SHELL決定了要調(diào)用執(zhí)行的shell


make make-args
以指定參數(shù)運行make,等同于'shell make make-args'


Logging Output
將GDB命令輸出到文件,有以下命令控制GDB的logging
1、set logging on
   使能logging
2、set logging off
   禁止logging
3、set logging file file
   改變當(dāng)前日志文件的名字,默認(rèn)為gdb.txt
4、set logging overwrite [on | off]]
   默認(rèn)情況下,GDB會append到logfile上,如果想覆蓋,則可以如此設(shè)置
5、set logging redirect [on | off]
   默認(rèn)情況下,GDB輸出會同時輸出到終端和日志文件,如果僅輸出到日志文件,則設(shè)置redirect
6、show logging

   輸出日志設(shè)置的當(dāng)前值


GDB命令
可以用回車鍵重復(fù)執(zhí)行部分GDB命令,可以用TAB鍵補(bǔ)齊GDB命令


命令語法
GDB命令可以使用首部部分字母縮寫來表示,前提是不引起混淆,可用help command-name來查看該命令幫助
空行(直接回車)作為GDB輸入意思是重復(fù)上一個命令,僅部分命令支持,例如run命令就不支持這種方式的重復(fù),用戶定義
的命令也禁止這樣做:
(gdb) help step
Step program until it reaches a different source line.
Argument N means do this N times (or till program stops for another reason).
(gdb) 
Step program until it reaches a different source line.
Argument N means do this N times (or till program stops for another reason).


list和x命令在使用RET重復(fù)時,需要構(gòu)建新的參數(shù),而不是簡單的重復(fù)上次的鍵入
#注釋
Ctrl-o用于重復(fù)命令的一個復(fù)雜序列,該命令接受當(dāng)前行,然后從歷史記錄中找到與當(dāng)前行相關(guān)的另一個行,用于編輯


補(bǔ)齊命令
TAB鍵


如果想看所有的GDB命令,可以ESC?或兩次TAB
更有可能使用的情況是可能在C++函數(shù)中使用的,因為C++支持重載,所以,同一函數(shù)名,需要以參數(shù)分開,可以在函數(shù)名前使用',這告訴GDB在
TAB時考慮更多的信息,例如:
(gdb) b ’bubble( M-?
bubble(double,double) bubble(int,int)
(gdb) b ’bubble(
可以使用set overload-resolution off來禁止overload resolution。也可以補(bǔ)齊struct結(jié)構(gòu)體中的變量


獲取幫助
1、(gdb) help  
顯示命令分類,如下所示:
(gdb) help
List of classes of commands:


aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
.....................


2、help class
顯示該類下的命令
(gdb) help status


3、help command
顯示命令使用幫助


4、apropos args
遍歷搜索所有的GDB命令及其文檔,來查找args指定的正則表達(dá)式,這會打印出所有匹配的信息。
(gdb) apropos reload
set symbol-reloading -- Set dynamic symbol table reloading multiple times in one run
set symbol-reloading -- Set dynamic symbol table reloading multiple times in one run
show symbol-reloading -- Show dynamic symbol table reloading multiple times in one run
show symbol-reloading -- Show dynamic symbol table reloading multiple times in one run
5、complete args
列出args開頭的所有可能的補(bǔ)齊命令
(gdb) complete i
if
ignore
info
init-if-undefined
inspect
interpreter-exec
interrupt


除了help之外,還可以用GDB命令info和show來查詢程序狀態(tài)或GDB狀態(tài)
1、info
描述你自己程序的狀態(tài),例如info args顯示傳遞給函數(shù)的參數(shù),info registers顯示當(dāng)前使用的寄存器,info breakpoints顯示斷點信息,可以用help info
查看其支持的子命令
2、set
用set設(shè)置環(huán)境變量
3、show
用來描述GDB自己的狀態(tài),用set修改,如:show radix和set radix ×××
為顯示所有可設(shè)置的參數(shù)及其當(dāng)前值,可以用show或info set
以下是三個無法用set修改的三個show子命令:
1、show version   GDB版本
2、show copying
   info copying   版權(quán)信息
3、show warranty
   info warranty 顯示GNU "NO WARRANTY"語句或warranty。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    成人综合网视频在线观看| 韩国日本欧美国产三级| 国产亚洲欧美一区二区| 亚洲精品美女三级完整版视频| 欧美人禽色视频免费看 | 欧美丰满人妻少妇精品| 日韩一区二区三区有码| 日本丰满大奶熟女一区二区| 91人妻人人揉人人澡人| 亚洲欧美国产精品一区二区| 久久中文字幕中文字幕中文| 国产又粗又猛又黄又爽视频免费 | 亚洲清纯一区二区三区| 中文文精品字幕一区二区| 视频一区二区 国产精品| 免费特黄欧美亚洲黄片| 丝袜人妻夜夜爽一区二区三区| 中文字幕亚洲精品人妻| 日韩性生活视频免费在线观看| 粉嫩一区二区三区粉嫩视频| 国产一区二区三区不卡| 午夜福利精品视频视频| 一区二区三区国产日韩| 国产精品蜜桃久久一区二区| 国产亚洲欧美日韩精品一区| 国产免费无遮挡精品视频| 亚洲精品福利视频你懂的| 午夜午夜精品一区二区| 五月的丁香婷婷综合网| 日韩欧美高清国内精品| 久久热这里只有精品视频| 日韩精品亚洲精品国产精品| 久热久热精品视频在线观看| 91福利视频日本免费看看| 国产成人精品视频一区二区三区| 亚洲欧美黑人一区二区| 熟女免费视频一区二区| 伊人色综合久久伊人婷婷| 伊人网免费在线观看高清版 | 欧美老太太性生活大片| 国产一区麻豆水好多高潮|