用GDB除錯程式(四) (轉)
檢視棧資訊
—————
當被停住了,你需要做的第一件事就是檢視程式是在哪裡停住的。當你的程式了一個,函式的地址,函式引數,函式內的區域性變數都會被壓入“棧”(Stack)中。你可以用G命令來檢視當前的棧中的資訊。
下面是一些檢視函式呼叫棧資訊的GDB命令:
backtrace
列印當前的函式呼叫棧的所有資訊。如:
(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
從上可以看出函式的呼叫棧資訊:__libc_start_main --> main() --> func()
backtrace
bt
n是一個正整數,表示只列印棧頂上n層的棧資訊。
backtrace
bt
-n表一個負整數,表示只列印棧底下n層的棧資訊。
如果你要檢視某一層的資訊,你需要在切換當前的棧,一般來說,程式停止時,最頂層的棧就是當前棧,如果你要檢視棧下面層的詳細資訊,首先要做的是切換當前棧。
frame
f
n是一個從0開始的整數,是棧中的層編號。比如:frame 0,表示棧頂,frame 1,表示棧的第二層。
up
表示向棧的上面移動n層,可以不打n,表示向上移動一層。
down
表示向棧的下面移動n層,可以不打n,表示向下移動一層。
上面的命令,都會列印出移動到的棧層的資訊。如果你不想讓其打出資訊。你可以使用這三個命令:
-frame
up-silently
down-silently
檢視當前棧層的資訊,你可以用以下GDB命令:
frame 或 f
會列印出這些資訊:棧的層編號,當前的函式名,函式引數值,函式所在及行號,函式到的語句。
info frame
info f
這個命令會列印出更為詳細的當前棧層的資訊,只不過,大多數都是執行時的內內地址。比如:函式地址,呼叫函式的地址,被呼叫函式的地址,目前的函式是由什麼樣的程式語言寫成的、函式引數地址及值、區域性變數的地址等等。如:
(gdb) info f
Stack level 0, frame at 0xbffff5d4:
e= 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
language c.
Arglist at 0xbffff5d4, args: n=250
Locals at 0xbffff5d4, Previous frame's sp is 0x0
Saved registers:
ebp at 0xbffff5d4, eip at 0xbffff5d8
info args
列印出當前函式的引數名及其值。
info locals
列印出當前函式中所有區域性變數及其值。
info catch
列印出當前的函式中的異常處理資訊。
檢視源程式
—————
一、顯示
GDB 可以列印出所程式的原始碼,當然,在程式編譯時一定要加上-g的引數,把源程式資訊編譯到執行檔案中。不然就看不到源程式了。當程式停下來以後,GDB會報告程式停在了那個檔案的第幾行上。你可以用list命令來列印程式的原始碼。還是來看一看檢視原始碼的GDB命令吧。
list
顯示程式第linenum行的周圍的源程式。
list
顯示函式名為function的函式的源程式。
list
顯示當前行後面的源程式。
list -
顯示當前行前面的源程式。
一般是列印當前行的上5行和下5行,如果顯示函式是是上2行下8行,預設是10行,當然,你也可以定製顯示的範圍,使用下面命令可以設定一次顯示源程式的行數。
set listsize
設定一次顯示原始碼的行數。
show listsize
檢視當前listsize的設定。
list命令還有下面的用法:
list
顯示從first行到last行之間的原始碼。
list ,
顯示從當前行到last行之間的原始碼。
list +
往後顯示原始碼。
一般來說在list後面可以跟以下這們的引數:
當前行號的正偏移量。
當前行號的負偏移量。
程式執行時的語句在中的地址。
二、搜尋原始碼
不僅如此,GDB還提供了原始碼搜尋的命令:
forward-search
search
向前面搜尋。
reverse-search
全部搜尋。
其中,
三、指定原始檔的路徑
某些時候,用-g編譯過後的執行程式中只是包括了原始檔的名字,沒有路徑名。GDB提供了可以讓你指定原始檔的路徑的命令,以便GDB進行搜尋。
directory
dir
加一個原始檔路徑到當前路徑的前面。如果你要指定多個路徑,下你可以使用“:”,下你可以使用“;”。
directory
清除所有的自定義的原始檔搜尋路徑資訊。
show directories
顯示定義了的原始檔搜尋路徑。
四、原始碼的記憶體
你可以使用info line命令來檢視原始碼在記憶體中的地址。info line後面可以跟“行號”,“函式名”,“檔名:行號”,“檔名:函式名”,這個命令會列印出所指定的原始碼在執行時的記憶體地址,如:
(gdb) info line tst.c:func
Line 5 of "tst.c" starts at address 0x8048456
還有一個命令(disemble)你可以檢視源程式的當前執行時的機器碼,這個命令會把目前記憶體中的指令dump出來。如下面的示例表示檢視函式func的程式碼。
(gdb) disassemble func
Dump of assembler code for function func:
0x8048450
0x8048451
0x8048453
0x8048456
0x804845d
0x8048464
0x8048467
0x804846a
0x804846c
0x804846e
0x8048470
0x8048473
0x8048476
0x8048479
0x804847b
0x804847c
0x8048480
0x8048483
0x8048485
0x8048487
0x8048489
0x804848a
End of assembler dump.
?id=19384">上一頁 下一頁->
(版權所有,轉載時請註明作者和出處)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-958530/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用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除錯