




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Linux中包含有一個很有用的調(diào)試工具gdb(GNU Debuger),它可以用來調(diào)試C和C+程序,功能不亞于Windows下的許多圖形界面的調(diào)試工具。和所有常用的調(diào)試工具一樣,gdb提供了以下功能:# 監(jiān)視程序中變量的值# 在程序中設置斷點# 程序的單步執(zhí)行在使用gdb前,必須先載入可執(zhí)行文件,因為要進行調(diào)試,文件中就必須包含調(diào)試信息,所以在用gcc或cc編譯時就需要用-g參數(shù)來打開程序的調(diào)試選項。調(diào)試開始時,必須先載入要進行調(diào)試的程序,可以用以下兩種方式:* 在啟動gdb后執(zhí)行以下命令:file 可執(zhí)行文件路徑* 在gdb啟動時就載入程序:gdb 可執(zhí)行文件路徑載入程序后,接下來就是要進行
2、斷點的設置,要監(jiān)視的變量的添加等工作,下面對在這個過程中常會用到的命令逐一進行介紹:* list :顯示程序中的代碼,常用使用格式有:list輸出從上次調(diào)用list命令開始往后的10行程序代碼。list -輸出從上次調(diào)用list命令開始往前的10行程序代碼。list n輸出第n行附近的10行程序代碼。list function輸出函數(shù)function前后的10行程序代碼。* forward/search :從當前行向后查找匹配某個字符串的程序行。使用格式:forward/search 字符串查找到的行號將保存在$_變量中,可以用print $_命令來查看。* reverse-search :和
3、forward/search相反,向前查找字符串。使用格式同上。* break :在程序中設置斷點,當程序運行到指定行上時,會暫停執(zhí)行。使用格式:break 要設置斷點的行號* tbreak :設置臨時斷點,在設置之后只起作用一次。使用格式:tbreak 要設置臨時斷點的行號* clear :和break相反,clear用于清除斷點。使用格式:clear 要清除的斷點所在的行號* run :啟動程序,在run后面帶上參數(shù)可以傳遞給正在調(diào)試的程序。* awatch :用來增加一個觀察點(add watch),使用格式:awatch 變量或表達式當表達式的值發(fā)生改變或表達式的值被讀取時,程序就會停
4、止運行。* watch :與awatch類似用來設置觀察點,但程序只有當表達式的值發(fā)生改變時才會停止運行。使用格 式:watch 變量或表達式需要注意的是,awatch和watch都必須在程序運行的過程中設置觀察點,即可運行run之后才能設置。* commands :設置在遇到斷點后執(zhí)行特定的指令。使用格式有:commands設置遇到最后一個遇到的斷點時要執(zhí)行的命令commands n設置遇到斷點號n時要執(zhí)行的命令注意,commands后面跟的是斷點號,而不是斷點所在的行號。在輸入命令后,就可以輸入遇到斷點后要執(zhí)行的命令,每行一條命令,在輸入最后一條命令后輸入end就可以結束輸入。* dele
5、te :清除斷點或自動顯示的表達式。使用格式:delete 斷點號* disable :讓指定斷點失效。使用格式:disable 斷點號列表斷點號之間用空格間隔開。* enable :和disable相反,恢復失效的斷點。使用格式:enable 斷點編號列表* ignore :忽略斷點。使用格式:ignore 斷點號 忽略次數(shù)* condition :設置斷點在一定條件下才能生效。使用格式:condition 斷點號 條件表達式* cont/continue :使程序在暫停在斷點之后繼續(xù)運行。使用格式:cont跳過當前斷點繼續(xù)運行。cont n跳過n次斷點,繼續(xù)運行。當n為1時,cont 1即
6、為cont。* jump :讓程序跳到指定行開始調(diào)試。使用格式:jump 行號* next :繼續(xù)執(zhí)行語句,但是跳過子程序的調(diào)用。使用格式:next執(zhí)行一條語句next n執(zhí)行n條語句* nexti :單步執(zhí)行語句,但和next不同的是,它會跟蹤到子程序的內(nèi)部,但不打印出子程序內(nèi)部的語句。使用格式同上。* step :與next類似,但是它會跟蹤到子程序的內(nèi)部,而且會顯示子程序內(nèi)部的執(zhí)行情況。使用格式同上。* stepi :與step類似,但是比step更詳細,是nexti和step的結合。使用格式同上。* whatis :顯示某個變量或表達式的數(shù)據(jù)類型。使用格式:whatis 變量或表達式*
7、 ptype :和whatis類似,用于顯示數(shù)據(jù)類型,但是它還可以顯示typedef定義的類型等。使用格式:ptype 變量或表達式* set :設置程序中變量的值。使用格式:set 變量=表達式set 變量:=表達式* display :增加要顯示值的表達式。使用格式:display 表達式* info display :顯示當前所有的要顯示值的表達式。* delete display/undisplay :刪除要顯示值的表達式。使用格式:delete display/undisplay 表達式編號* disable display :暫時不顯示一個要表達式的值。使用格式:disable d
8、isplay 表達式編號* enable display :與disable display相反,使用表達式恢復顯示。使用格式:enable display 表達式編號* print :打印變量或表達式的值。使用格式:print 變量或表達式表達式中有兩個符號有特殊含義:$和$。$表示給定序號的前一個序號,$表示給定序號的前兩個序號。如果$和$后面不帶數(shù)字,則給定序號為當前序號。* backtrace :打印指定個數(shù)的棧幀(stack frame)。使用格式:backtrace 棧幀個數(shù)* frame :打印棧幀。使用格式:frame 棧幀號* info frame :顯示當前棧幀的詳細信息。
9、* select-frame :選擇棧幀,選擇后可以用info frame來顯示棧幀信息。使用格式:select-frame 棧幀號* kill :結束當前程序的調(diào)試。* quit :退出gdb。 如要查看所有的gdb命令,可以在gdb下鍵入兩次Tab(制表符),運行“help command”可以查看命令command的詳細使用格式。本文僅對使用gdb調(diào)試過程中的一些常用指令的用法進行簡單地總結,如要獲取關于gdb的更詳細的資料,請參閱gdb的官方文檔:/software/gdb/documentation/ gdb 命令大全1. 啟動gdb 應用程序名gd
10、b 應用程序名 core文件名gdb 應用程序名 pid gdb -args 應用程序名 應用程序的運行參數(shù)幫助:help 顯示幫助info 顯示程序狀態(tài)set 修改show 顯示gdb狀態(tài)運行及運行環(huán)境設置:set args # 設置運行
11、參數(shù)show args # 顯示運行參數(shù)set env 變量名 = 值 # 設置環(huán)境變量unset env 變量名 # 取消環(huán)境變量show env 變量名 # 顯示環(huán)境變量path 目錄名 # 把目錄添加到查找路徑中show paths # 顯示當前查找路徑cd
12、 目錄 # 切換工作目錄pwd # 顯示當前工作目錄tty /dev/pts/1 # 修改程序的輸入輸出到指定的ttyset inferior-tty /dev/pts/1 # 修改程序的輸出到指定的ttyshow
13、inferior-ttyshow ttyrun 參數(shù) # 運行start 參數(shù) # 開始運行,但是會在main函數(shù)停止attach piddetachkill # 退出Ctrl-C # 中斷(SIGINT)Ctrl-線程操作:info threads # 查看所有
14、線程信息thread 線程id # 切換到指定線程thread apply threadno | all 參數(shù) # 對所有線程都應用某個命令子進程調(diào)試:set follow-fork-mode child|parent # fork后,需要跟蹤誰show follow-fork-modeset detach-on-flow on|off
15、; # fork后,需要兩個都跟蹤嗎info forks # 顯示所有進程信息fork 進程id
16、 # 切換到某個進程detach-fork 進程id # 不再跟蹤某個進程delete fork 進程id &
17、#160; # kill某個進程并停止對它的跟蹤檢查點: checkpoint/restart查看停止原因:info program斷點(breakpoint): 程序運行到某處就會中斷break(b) 行號|函數(shù)名|程序地址 | +/-offset | filenam:func if 條件 # 在指定位置設置
18、斷點tbreak . # 與break相似,只是設置一次斷點hbreak . # 與break相似,只是設置硬件斷點,需要硬件支持thbreak . # 與break相似,只是設置一次性硬件斷點,需要硬件支持rbre
19、ak 正則表達式 # 給一批滿足條件的函數(shù)打上斷點info break 斷點號 # 查看某個斷點或所有斷點信息set breadpoint pending auto|on|off # 查看如果斷點位置沒有找到時行為show breakpoint pending觀察點(watchpoint): 表達式的值修改時會被中斷watch 表達式
20、 # 當表達式被寫入,并且值被改變時中斷rwatch 表達式 # 當表達式被讀時中斷awatch 表達式 # 當表達式被讀或?qū)憰r中斷info watchpoints set can-use-hw-watchpoints 值 # 設置使用的硬件觀察點的數(shù)
21、show can-use-hw-watchpoints rwatch與awatch需要有硬件支持,另外如果是對局部變量使用watchpoint,那退出作用域時觀察點會自動被刪除另外在多線程情況下,gdb的watchpoint只對一個線程有效捕獲點(catchpoint): 程序發(fā)生某個事件時停止,如產(chǎn)生異常時catch 事件名事件包括:throw # 產(chǎn)生c+異常catch
22、0; # 捕獲到c+異常exec/fork/vfork # 一個exec/fork/vfork函數(shù)調(diào)用,只對HP-UXload/unload 庫名 # 加載/卸載共享庫事件,對只HP-UXtcatch 事件名 # 一次性catchinfo break斷點操作:cl
23、ear 函數(shù)名|行號 # 刪除斷點,無參數(shù)表示刪衛(wèi)當前位置delete 斷點號 # 刪除斷點,無參數(shù)表示刪所有斷點disable 斷點號enable 斷點號condition 斷點號 條件 # 增加斷點條件condition 斷點號
24、0; # 刪除斷點條件ignore 斷點號 數(shù)目 # 忽略斷點n次commands 斷點號 # 當某個斷點中斷時打印條件條件end下面是一個例子,可以一直打印當前的X值:commands 3printf "X:%d/n
25、",xcontend斷點后操作:continue(c) 忽略次數(shù) # 繼續(xù)執(zhí)行,忽略前面n次中斷fg 忽略次數(shù) # 繼續(xù)執(zhí)行,忽略前面n次中斷step(s) n步 # 步進,重復n次next(n) n步
26、160; # 前進,重復n次finish # 完成當前函數(shù)調(diào)用,一直執(zhí)行到返回處,并打印返回值until(u) 位置 # 一直執(zhí)行到當前行或指定位置,或是當前函數(shù)返回advance
27、 位置 # 前面到指定位置,如果當前函數(shù)返回則停止,與until類似stepi(si) n步 # 精確的只執(zhí)行一個匯編指令,重復n次nexti(ni) n步 # 精確的只執(zhí)行一個匯編指令,碰到函數(shù)跳過,重復n次set step-
28、mode on|off # on時,如果函數(shù)沒有調(diào)試信息也跟進show step-mode信號:info signals # 列出所有信號的處理方式info handle # 同上handle 信號
29、60; 方式 # 改變當前處理某個信號的方式方式包括:nostop # 當信號發(fā)生時不停止,只打印信號曾經(jīng)發(fā)生過stop # 停止并打印信號print # 信號發(fā)生時打印noprint # 信號發(fā)生時不打印pass/noignore # gdb充許應用程序看到這個信號nopass/ignore # gdb不充許應用程序看到這個信號線程斷點:break 行號信息 thread 線程號
30、 if 條件 # 只在某個線程內(nèi)加斷點線程調(diào)度鎖:set scheduler-locking on|off # off時所有線程都可以得到調(diào)度,on時只有當前show scheduler-locking幀:frame(f) 幀號 # 不帶參數(shù)時顯示所有幀信息,帶參數(shù)時切換到指定幀frame 地址 # 切換到指定
31、地址的幀up n # 向上n幀down n # 向下n幀select-frame 幀號 # 切換到指定幀并且不打印被轉(zhuǎn)換到的幀的信息up-silently n #
32、60; 向上n幀,不顯示幀信息down-silently n # 向下n幀,不顯示幀信息調(diào)用鏈:backtrace(bt) n|-n|full # 顯示當前調(diào)用鏈,n限制顯示的數(shù)目,-n表示顯示后n個,n表示顯示前n個,full的話還會顯示變量信息使用 thread apply all bt 就可以顯示所有線程的調(diào)用信息set backtrace past-main on|off show backtrace past-main set backtrace past-entry on|o
33、ff show backtrace past-entryset backtrace limit n # 限制調(diào)用信息的顯示層數(shù)show backtrace limit顯示幀信息:info frame # 顯示當前幀信息info frame addr # 顯示指定地
34、址的幀信息info args # 顯示幀的參數(shù)info locals # 顯示局部變量信息info catch # 顯示本幀異常信息顯示行號:list(l) 行號|函數(shù)|文件:行號
35、 # 顯示指定位置的信息,無參數(shù)為當前位置list - # 顯示當前行之前的信息list first,last
36、; # 從frist顯示到last行l(wèi)ist ,last # 從當前行顯示到last行l(wèi)ist frist,
37、 # 從指定行顯示list + # 顯示上次list后顯示的內(nèi)容list -
38、0; # 顯示上次list前面的內(nèi)容在上面,first和last可以是下面類型:行號+偏移-偏移文件名:行號函數(shù)名函數(shù)名:行號set listsize n
39、# 修改每次顯示的行數(shù)show listsize編輯:edit 行號|函數(shù)|函數(shù)名:行號|文件名:函數(shù)名 # 編輯指定位置查找:search 表示式 # 向前查找表達式reverse-search 表示式 # 向后查找表達式指定源碼目錄:directory(dir
40、) 目錄名 # 指定源文件查找目錄show directories源碼與機器碼:info line 函數(shù)名|行號 # 顯示指定位置對應的機器碼地址范圍disassemble 函數(shù)名 | 起始地址 結束地址 # 對指定范圍進行反匯編set disassembly-flavor att|intel # 指定匯編代碼形式show disassembly-flavo
41、r 查看數(shù)據(jù):ptype 表達式 # 查看某個表達式的類型print /f 表達式 # 按格式查看表達式內(nèi)容,/f是格式化set print address on|off # 打印時是不是顯示地址信息show print addressset print symbol-filename on|off # 是不是顯示符號所在文件等信息show print symbol-filenameset print ar
42、ray on | off # 是不是打印數(shù)組show print arrayset print array index on | off # 是不是打印下標show print array index.表達式可以用下面的修飾符:varn # 表示把var當成長度為n的數(shù)組filename:var
43、160; # 表示打印某個函數(shù)內(nèi)的變量,filename可以換成其它范圍符如文件名type var # 表示把var當成type類型輸出格式:x # 16進制d
44、0; # 10進制u # 無符號o # 8進制t
45、 # 2進制a # 地址c # 字符f
46、; # 浮點查看內(nèi)存:x /nfu 地址 # 查看內(nèi)存n 重復n次f 顯示格式,為print使用的格式u 每個單元的大小,為b
47、60; byteh 2 bytew 4 byteg 8 byte自動顯示:display /fmt 表達式 # 每次停止時都會顯示表達式,fmt與print的格式一樣,如果是內(nèi)存地址,那fmt可像 x的參數(shù)一樣undisplay 顯示編號delete display 顯示編號 #
48、0; 這兩個都是刪附某個顯示disable display 顯示編號 # 禁止某個顯示enable display 顯示編號 # 重顯示display # 顯示當前顯示內(nèi)容info display
49、0; # 查看所有display項查看變量歷史:show values 變量名 n # 顯示變量的上次顯示歷史,顯示n條show values 變量名 + # 繼續(xù)上次顯示內(nèi)容便利變量: (聲明變量的別名以方便使用)
50、set $foo = *object_ptr # 聲明foo為object_ptr的便利變量init-if-undefined $var = expression # 如果var還未定義則賦值show convenience內(nèi)部便利變量:$_ 上次x查看的地址$_$_exitcode 程序垢退出碼寄存器:into registers # 除了浮點
51、寄存器外所有寄存器info all-registers # 所有寄存器into registers 寄存器名 # 指定寄存器內(nèi)容info float # 查看浮點寄存器狀態(tài)info vector # 查看向量寄存器狀態(tài)gdb為一些內(nèi)部寄存器定義了名字,
52、如$pc(指令),$sp(棧指針),$fp(棧幀),$ps(程序狀態(tài))p /x $pc # 查看pc寄存器當前值x /i $pc # 查看要執(zhí)行的下一條指令set $sp += 4 # 移動棧指針內(nèi)核中信息:info udot # 查看內(nèi)核中user struct信息info auxv #
53、; 顯示auxv內(nèi)容(auxv是協(xié)助程序啟動的環(huán)境變量的)內(nèi)存區(qū)域限制:mem 起始地址 結構地址 屬性 # 對地始地址,結構地址)區(qū)域內(nèi)存進行保護,如果結構地址為0表示地址最大值0xffffffffdelete mem 編號 # 刪除一個內(nèi)存保護disable mem 編號 #
54、0; 禁止一個內(nèi)存保護enable mem 編號 # 打開一個內(nèi)存保護info mem # 顯示所有內(nèi)存保護信息保護的屬性包括:1. 內(nèi)存訪問模式:
55、0; ro | wo |rw2. 內(nèi)存訪問大小: 8 | 16 | 32 | 64 如果不限制,表示可按任意大小訪問3. 數(shù)據(jù)緩存: cache | nocache cache表示充許gdb緩存目標內(nèi)存 內(nèi)存復制到/從文件:dump 格式 memory 文件名 起始地址 結構地址 # 把指定內(nèi)存段寫到文件dump 格式 value 文件名 表達式 &
56、#160; # 把指定值寫到文件格式包括:binary 原始二進制格式ihex intel 16進制格式srec S-recored格式tekhex tektronix 16進制格式append bina
57、ry memory 文件名 起始地址 結構地址 # 按2進制追加到文件append binary value 文件名 表達式 # 按2進制追加到文件restore 文件名 binary bias 起始地址 結構地址 # 恢復文件中內(nèi)容到內(nèi)存.如果文件內(nèi)容是原始二進制,需要指定binary參數(shù),不然會gdb自動識別文件格式產(chǎn)生core dump文件gcore
58、文件名 # 產(chǎn)生core dump文件字符集:set target-charset 字符集 # 聲明目標機器的locale,如gdbserver所在機器set host-charset 字符集 # 聲明本機的localeset charset 字符集 # 聲明目標機和本機的localeshow charsetshow host-charsetshow tar
59、get-charset緩存遠程目標的數(shù)據(jù):為提高性能可以使用數(shù)據(jù)緩存,不過gdb不知道volatile變量,緩存可能會顯示不正確的結構set remotecache on | offshow remotecache info dcache # 顯示數(shù)據(jù)緩存的性能C預處理宏:macro expand(exp) 表達式 # 顯示宏展開結果macro expand-once(
60、expl) 表達式 # 顯示宏一次展開結果macro info 宏名 # 查看宏定義追蹤(tracepoint): 就是在某個點設置采樣信息,每次經(jīng)過這個點時只執(zhí)行已經(jīng)定義的采樣動作但并不停止,最后再根據(jù)采樣結果進行分析。采樣點定義:trace 位置 &
61、#160; # 定義采樣點info tracepoints # 查看采樣點列表delete trace 采樣點編號 # 刪除采杰點disable trace 采樣點編號 # 禁止采杰點enable trace 采樣點編號 # 使用采杰點passcount 采樣點編號 n # 當通過采樣點 n次后停止,不指定n則
62、在下一個斷點停止預定義動作:預定義動作以actions開始,后面是一系列的動作actions num # 對采樣點num定義動作行為:collect 表達式 # 采樣表達式信息一些表達式有特殊意義,如$regs(所有寄存器),$args(所有函數(shù)參數(shù)),$locals(所有局部變量)while-steping n #
63、60; 當執(zhí)行第n次時的動作,下面跟自己的collect操作采樣控制:tstart # 開始采樣tstop # 停止采樣
64、tstatus # 顯示當前采樣的數(shù)據(jù)使用收集到的數(shù)據(jù):tfind start # 查找第一個記錄tfind end | none
65、# 停止查找tfind # 查找下一個記錄tfind - # 查找上一個記錄tfind tracepoint N
66、0; # 查找 追蹤編號為N 的下一個記錄tfind pc 地址 # 查找代碼在指定地址的下一個記錄tfind range 起始,結束tfind outside 起始,結構tfind line 文件名:行號tdump # 顯示當前記錄中追蹤信息save-tracepoints 文件名 # 保存追蹤信息到指定文件,后面使用source命令讀追蹤中的便利
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 借貸擔保條件合同范本
- 買賣旅游車車合同范本
- 制作類開口合同范本
- 包工包料安裝鍋爐合同范本
- 養(yǎng)豬場租賃合同范本
- 鄉(xiāng)鎮(zhèn)土地開發(fā)整改合同范本
- 佛山土地出租合同范本
- 付款協(xié)議合同范本
- 農(nóng)村養(yǎng)牛蛙銷售合同范本
- ktv裝修乙方合同范本
- 社區(qū)衛(wèi)生服務站設置基本標準
- 卡博特藍星化工(江西)有限公司年產(chǎn)8000噸氣相二氧化硅項目環(huán)境影響報告
- 2024年度(完整版)《各種各樣的天氣》課件
- 企業(yè)安全培訓課件-網(wǎng)絡與信息安全
- 《無障礙設計》課件
- 《長征勝利萬歲》楊成武-【中職專用】高一語文下學期同步課堂(高教版2023·基礎模塊下冊)
- 云母制品在阻燃材料中的應用
- 設備采購 投標方案(技術方案)
- 月考后正確的試卷分析方法分析研究
- 越野車改裝方案
- 修辭手法在計算機語言學中的應用
評論
0/150
提交評論