backtrace:查看函數的調用順序(函數調用棧的信息)
frame N (實際上是上下文跳轉的命令):切換到棧編號為N的上下文中
info frame:查看當前函數調用的棧幀信息。所謂棧幀就是與函數調用相關的棧上的消息
什么是棧幀信息
深入info命令
命令 功能說明
info registers 查看當前寄存器的值
info args 查看當前函數參數的值
info locals 查看當前局部變量的值
info frame 查看當前棧幀的詳細信息
info variables 查看程序中的變量符號
info functions 查看程序中的函數符號
示例:函數調用棧的查看
#include <stdio.h>
int sum(int n) { int ret =0; if(n > 0) { ret = n += sum(n-1); } return ret; } int main() { int s=0; s = sum(10); printf("sum = %d\n",s); return 0; }
調試過程如下:
gdb (gdb) file test.out (gdb) start (gdb) break sun if n==0 (gdb) continue (gdb) backtrace //此時就會顯示函數調用的順序
如果此時面對的是開源代碼,想知道我們感興趣的函數是如何調用的,可以通過backtrace 給我們的啟示:當分析不太熟悉的代碼時,gdb是一個很好的助手。 (gdb) next (gdb) next (gdb) info args //將會打印0
(gdb) frame 7 //切換到編號為7的棧幀所對應的函數調用上下文中去了
(gdb) info args //將會打印7
(gdb) info locals //打印局部變量的值
(gdb) frame 0 (gdb) info registers 打印寄存器的值 (gdb) info frame
一些調試中的小技巧
操作 命令 端點處自動打印 display /f expression display設置斷點的自動打印 undisplay 查看程序中的符號 whatis 所對應的信息 ptype GDB中的代碼查看 list set listsize N GDB中的shell操作 shell
技巧示例:斷點處自動打印
(gdb) shell gcc -g test.c -o test.out (gdb) file test.out (gdb) start (gdb) break test.c : 18 (gdb) continue (gdb) display / d i (gdb) display / d i*i (gdb) display / a &i
每次斷點被觸發,i,i*i,i的地址就會被打印出來
技巧示例:符號查看
(gdb) whatis func type = int() 函數類型 (gdb) ptype func type = int() (gdb) whatis g_var type = int (gdb) ptype g_var type = int (gdb) whatis struct ST type = struct ST (gdb) ptype struct ST type = struct ST{ int i; int j; };
示例2:
gdb (gdb) shell cat test.c 或 (gdb) shell gedit test.c (gdb) shell gcc -g test.c -o test.out (gdb) file test.out (gdb) start (gdb) break test.c:18 (gdb) list test.c : 18 //如果不知道test.c的第18行是什么,可以用list來查看
(gdb) set listsize 20 設置顯示代碼的行數,每次顯示20行 (gdb) show listsize 看看設置有沒有成功 (gdb) list test.c : 18 (gdb) continue
//每次程序執行到這個斷點時,下面我們感興趣的值就會被打印出來
(gdb) display /d i (gdb) display /d i*i (gdb) display / a &i (gdb) continue