函數調用棧的查看(backtrace和frame)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM