用GDB除錯程式(三) (轉)
四、維護停止點
上面說了如何設定的停止點,G中的停止點也就是上述的三類。在GDB中,如果你覺得已定義好的停止點沒有用了,你可以使用delete、clear、disable、enable這幾個命令來進行維護。
clear
清除所有的已定義的停止點。
clear
clear
清除所有設定在上的停止點。
clear
clear
清除所有設定在指定行上的停止點。
delete [breakpoints] [range...]
刪除指定的斷點,breakpoints為斷點號。如果不指定斷點號,則表示刪除所有的斷點。range 表示斷點號的範圍(如:3-7)。其簡寫命令為d。
比刪除更好的一種方法是disable停止點,disable了的停止點,GDB不會刪除,當你還需要時,enable即可,就好像回收站一樣。
disable [breakpoints] [range...]
disable所指定的停止點,breakpoints為停止點號。如果什麼都不指定,表示disable所有的停止點。簡寫命令是dis.
enable [breakpoints] [range...]
enable所指定的停止點,breakpoints為停止點號。
enable [breakpoints] once range...
enable所指定的停止點一次,當程式停止後,該停止點馬上被GDB自動disable。
enable [breakpoints] delete range...
enable所指定的停止點一次,當程式停止後,該停止點馬上被GDB自動刪除。
五、停止條件維護
前面在說到設定斷點時,我們提到過可以設定一個條件,當條件成立時,程式自動停止,這是一個非常強大的功能,這裡,我想專門說說這個條件的相關維護命令。一般來說,為斷點設定一個條件,我們使用if關鍵詞,後面跟其斷點條件。並且,條件設定好後,我們可以用condition命令來修改斷點的條件。(只有break和watch命令支援if,catch目前暫不支援if)
condition
修改斷點號為bnum的停止條件為expression。
condition
清除斷點號為bnum的停止條件。
還有一個比較特殊的維護命令ignore,你可以指定程式執行時,忽略停止條件幾次。
ignore
表示忽略斷點號為bnum的停止條件count次。
六、為停止點設定執行命令
我們可以使用GDB提供的command命令來設定停止點的執行命令。也就是說,當執行的程式在被停止住時,我們可以讓其自動執行一些別的命令,這很有利行自動化。對基於GDB的自動化除錯是一個強大的支援。
commands [bnum]
... command-list ...
end
為斷點號bnum指寫一個命令列表。當程式被該斷點停住時,gdb會依次執行命令列表中的命令。
例如:
break foo if x>0
commands
printf "x is %dn",x
continue
end
斷點設定在函式foo中,斷點條件是x>0,如果程式被斷住後,也就是,一旦x的值在foo函式中大於0,GDB會自動列印出x的值,並繼續執行程式。
如果你要清除斷點上的命令序列,那麼只要簡單的一下commands命令,並直接在打個end就行了。
七、斷點選單
在C++中,可能會重複出現同一個名字的函式若干次(函式過載),在這種情況下,break
(gdb) b String::after
[0] cancel
[1] all
[2] file:String.cc; line number:867
[3] file:String.cc; line number:860
[4] file:String.cc; line number:875
[5] file:String.cc; line number:853
[6] file:String.cc; line number:846
[7] file:String.cc; line number:735
> 2 4 6
Breakpoint 1 at 0xb26c: file String.cc, line 867.
Breakpoint 2 at 0xb344: file String.cc, line 875.
Breakpoint 3 at 0xafcc: file String.cc, line 846.
Multiple breakpoints were set.
Use the "delete" command to delete unwanted
breakpoints.
(gdb)
可見,GDB列出了所有after的過載函式,你可以選一下列表編號就行了。0表示放棄設定斷點,1表示所有函式都設定斷點。
八、恢復程式執行和單步除錯
當程式被停住了,你可以用continue命令恢復程式的執行直到程式結束,或下一個斷點到來。也可以使用step或next命令單步跟蹤程式。
continue [ignore-count]
c [ignore-count]
fg [ignore-count]
恢復程式執行,直到程式結束,或是下一個斷點到來。ignore-count表示忽略其後的斷點次數。continue,c,fg三個命令都是一樣的意思。
step
單步跟蹤,如果有函式,他會進入該函式。進入函式的前提是,此函式被編譯有de資訊。很像VC等工具中的step in。後面可以加count也可以不加,不加表示一條條地執行,加表示執行後面的count條指令,然後再停住。
next
同樣單步跟蹤,如果有函式呼叫,他不會進入該函式。很像VC等工具中的step over。後面可以加count也可以不加,不加表示一條條地執行,加表示執行後面的count條指令,然後再停住。
set step-mode
set step-mode on
開啟step-mode,於是,在進行單步跟蹤時,程式不會因為沒有debug資訊而不停住。這個引數有很利於檢視機器碼。
set step-mod off
關閉step-mode模式。
finish
執行程式,直到當前函式完成返回。並列印函式返回時的堆疊地址和返回值及引數值等資訊。
until 或 u
當你厭倦了在一個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。
stepi 或 si
nexti 或 ni
單步跟蹤一條機器指令!一條程式程式碼有可能由數條機器指令完成,stepi和nexti可以單步執行機器指令。與之一樣有相同功能的命令是“display/i $pc” ,當執行完這個命令後,單步跟蹤會在打出程式程式碼的同時打出機器指令(也就是程式碼)
九、訊號(Signals)
訊號是一種軟中斷,是一種處理非同步事件的方法。一般來說,操作都支援許多訊號。尤其是,比較重要應用程式一般都會處理訊號。UNIX定義了許多訊號,比如SIGINT表示中斷字元訊號,也就是Ctrl+C的訊號,SIGBUS表示故障的訊號;SIGCHLD表示子程式狀態改變訊號;SIGKILL表示終止程式執行的訊號,等等。訊號量是UNIX下非常重要的一種技術。
GDB有能力在你除錯程式的時候處理任何一種訊號,你可以告訴GDB需要處理哪一種訊號。你可以要求GDB收到你所指定的訊號時,馬上停住正在執行的程式,以供你進行除錯。你可以用GDB的handle命令來完成這一功能。
handle
在GDB中定義一個訊號處理。訊號
nostop
當被除錯的程式收到訊號時,GDB不會停住程式的執行,但會打出訊息告訴你收到這種訊號。
stop
當被除錯的程式收到訊號時,GDB會停住你的程式。
print
當被除錯的程式收到訊號時,GDB會顯示出一條資訊。
noprint
當被除錯的程式收到訊號時,GDB不會告訴你收到訊號的資訊。
pass
noignore
當被除錯的程式收到訊號時,GDB不處理訊號。這表示,GDB會把這個訊號交給被除錯程式會處理。
nopass
ignore
當被除錯的程式收到訊號時,GDB不會讓被除錯程式來處理這個訊號。
info signals
info handle
檢視有哪些訊號在被GDB檢測中。
十、執行緒(Thread Stops)
如果你程式是多執行緒的話,你可以定義你的斷點是否在所有的執行緒上,或是在某個特定的執行緒。GDB很容易幫你完成這一工作。
break
break
linespec指定了斷點設定在的源程式的行號。threadno指定了執行緒的ID,注意,這個ID是GDB分配的,你可以透過“info threads”命令來檢視正在執行程式中的執行緒資訊。如果你不指定thread
(gdb) break frik.c:13 thread 28 if bartab > lim
當你的程式被GDB停住時,所有的執行執行緒都會被停住。這方便你你檢視執行程式的總體情況。而在你恢復程式執行時,所有的執行緒也會被恢復執行。那怕是主程式在被單步除錯時。
?id=19360">上一頁 ->
(版權所有,轉載時請註明作者和出處)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982246/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用GDB除錯程式(二) (轉)除錯
- 用GDB除錯程式(四) (轉)除錯
- 用GDB除錯程式除錯
- 用GDB除錯程式(六)除錯
- GDB 除錯程式碼除錯
- gdb除錯多程式除錯
- GDB多程式除錯除錯
- linux下用gdb除錯c程式Linux除錯C程式
- 使用 GDB 除錯多程式程式除錯
- gdb除錯除錯
- GDB程式碼除錯與使用除錯
- GDB除錯MySQL除錯MySql
- gdb除錯命令除錯
- GDB除錯指令除錯
- Linux中使用GDB除錯程式Linux除錯
- gdb除錯正在執行的程式除錯
- GDB除錯彙總除錯
- gdb除錯快速上手除錯
- gdb除錯多程序除錯
- gdb除錯總結除錯
- 使用GDB命令列偵錯程式除錯C/C++程式命令列除錯C++
- 在MacOS上使用gdb(cgdb)除錯Golang程式Mac除錯Golang
- Linux GDB 程式除錯工具使用詳解Linux除錯
- 介紹 GDB 除錯 Go除錯Go
- GDB除錯命令詳解除錯
- C語言——gdb除錯C語言除錯
- GDB除錯使用記錄除錯
- Codeblocks和gdb除錯BloC除錯
- linux 下GDB除錯Linux除錯
- gdb高階除錯方法高階除錯
- 使用 gdb 工具除錯 Go除錯Go
- gdb除錯coredump檔案除錯
- gdb高階除錯命令高階除錯
- 使用GDB除錯Android Native 層程式碼除錯Android
- c/c++ gdb 除錯帶引數的程式C++除錯
- Linux環境組合語言程式設計初步——使用gdb除錯程式(轉)Linux組合語言程式設計除錯
- C編譯: 使用gdb除錯編譯除錯
- Linux核心使用gdb除錯Linux除錯