查看棧信息
當程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。當你的程序調用了一個函數,函數的地址,函數參數,函數內的局部變量都會被壓入“棧”(Stack)中。你可以用GDB命令來查看當前的棧中的信息。
下面是一些查看函數調用棧信息的GDB命令:
Backtrace,bt 打印當前的函數調用棧的所有信息。如:
(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 <n>, bt <n> n是一個正整數,表示只打印棧頂上n層的棧信息。
backtrace <-n> ,bt <-n> -n表一個負整數,表示只打印棧底下n層的棧信息。
如果你要查看某一層的信息,你需要在切換當前的棧,一般來說,程序停止時,最頂層的棧就是當前棧,如果你要查看棧下面層的詳細信息,首先要做的是切換當前棧。
frame <n>,f <n> n是一個從0開始的整數,是棧中的層編號。比如:frame 0,表示棧頂,frame 1,表示棧的第二層。
up <n> 表示向棧的上面移動n層,可以不打n,表示向上移動一層。
down <n> 表示向棧的下面移動n層,可以不打n,表示向下移動一層。
上面的命令,都會打印出移動到的棧層的信息。如果你不想讓其打出信息。你可以使用這三個命令:
select-frame <n> 對應于 frame 命令。
up-silently <n> 對應于 up 命令。
down-silently <n> 對應于 down 命令。
查看當前棧層的信息,你可以用以下GDB命令:
frame 或 f 會打印出這些信息:棧的層編號,當前的函數名,函數參數值,函數所在文件及行號,函數執行到的語句。
info frame,info f 這個命令會打印出更為詳細的當前棧層的信息,只不過,大多數都是運行時的內內地址。比如:函數地址,調用函數的地址,被調用函數的地址,目前的函數是由什么樣的程序語言寫成的、函數參數地址及值、局部變量的地址等等。如:
(gdb) info f
Stack level 0, frame at 0xbffff5d4:
eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
source 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 打印出當前的函數中的異常處理信息。
posted on 2008-12-09 21:06
。。。。 閱讀(1817)
評論(0) 編輯 收藏 引用 所屬分類:
c++ 、
c++ 編譯 調試 開發環境