gdb调试之堆栈跟踪
生活随笔
收集整理的這篇文章主要介紹了
gdb调试之堆栈跟踪
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
在使用gdb調試時,經常要用到查看堆棧信息,特別是在內核調試時,這
顯得尤其重要。通過gdb的堆棧跟蹤,可以看到所有已調用的函數列表,以及
每個函數在棧中的信息。
---------------------------------------------------------------------------------
一,簡單實例。
#include?<stdio.h>
int?sum(int?m,int?n)
{
????int?i?=?3;
????int?j?=?4;
???return m+n;????
}
int?main(void)
{
????int?m?=?10;
????int?n?=?9;
????int?ret?=?0;
????ret?=?sum(m,n);
????printf("ret = %d\n",ret);
????return 0;????
} (gdb)?bt
#0 sum?(m=10,?n=9)?at sum.c:5
#1 0x08048418?in?main?()?at sum.c:16 每次有函數調用,在棧上就會生成一個???#xff08;stack frame),也就是一個數據
單元用來描述該函數,描述函數的地址,參數,還有函數的局部變量的值等信息。
使用bt命令就可以把這個棧的調用信息全部顯示出來。
由上面的顯示結果可以看出,棧上有兩個???stack frame),分別用來描述函數 main和函數sum.前面的#0表示sum函數??虻臉颂?。#1表示main函數棧框的標號。 最新的棧框標號為0.main函數??驑颂栕畲?。
(gdb) frame 1 #1 0x08048418 in main () at sum.c:16 16 ret = sum(m,n); frame 1 表示選擇棧框1,也就是選擇了main函數的棧框,因為我這時候想查看
main函數的信息。
(gdb)?info locals
m?=?10
n?=?9
ret?=?0 這時候可以通過info locals查看main函數??蚶锩婢植孔兞康闹?。
-----------------------------------------------------------------------------------
二,使用gdb堆棧跟蹤很方面調試遞歸程序。
#include?<stdio.h>
long long func(int?n)
{
????int?i?=?0;
????if?(n?>?20)?{
????????printf("n too large!\n");
????????return?-1;
????}
????if?(n?==?0)?
????????return 1;
????else?{
????????i?=?n?*?func(n-1);
????????return i;
????}
}
int?main(void)
{
????long long ret;
????ret?=?func(10);
????printf("ret = %lld\n",ret);
????return 0;
} (gdb)?bt
#0 func?(n=7)?at test.c:7
#1 0x0804843f?in?func?(n=8)?at test.c:14
#2 0x0804843f?in?func?(n=9)?at test.c:14
#3 0x0804843f?in?func?(n=10)?at test.c:14
#4 0x08048469?in?main?()?at test.c:22 如上所示,可以很清楚地看到遞歸深入到了第幾層,以及該層局部變量值的情況。
---------------------------------------------------------------------------------
三,gdb使用手冊上有一塊專門說如何查看堆棧,翻譯后的文檔如下:
?gdb查看堆棧.rar??? ----------------------------------------------------------------------------------
參考:?http://www.ibm.com/developerworks/cn/linux/sdk/gdb/index.html? 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
---------------------------------------------------------------------------------
一,簡單實例。
單元用來描述該函數,描述函數的地址,參數,還有函數的局部變量的值等信息。
使用bt命令就可以把這個棧的調用信息全部顯示出來。
由上面的顯示結果可以看出,棧上有兩個???stack frame),分別用來描述函數 main和函數sum.前面的#0表示sum函數??虻臉颂?。#1表示main函數棧框的標號。 最新的棧框標號為0.main函數??驑颂栕畲?。
-----------------------------------------------------------------------------------
二,使用gdb堆棧跟蹤很方面調試遞歸程序。
---------------------------------------------------------------------------------
三,gdb使用手冊上有一塊專門說如何查看堆棧,翻譯后的文檔如下:
?gdb查看堆棧.rar??? ----------------------------------------------------------------------------------
參考:?http://www.ibm.com/developerworks/cn/linux/sdk/gdb/index.html? 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的gdb调试之堆栈跟踪的全部內容,希望文章能夠幫你解決所遇到的問題。