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