gdb调试之堆栈跟踪
生活随笔
收集整理的這篇文章主要介紹了
gdb调试之堆栈跟踪
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
在使用gdb調(diào)試時(shí),經(jīng)常要用到查看堆棧信息,特別是在內(nèi)核調(diào)試時(shí),這
顯得尤其重要。通過gdb的堆棧跟蹤,可以看到所有已調(diào)用的函數(shù)列表,以及
每個(gè)函數(shù)在棧中的信息。
---------------------------------------------------------------------------------
一,簡單實(shí)例。
#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 每次有函數(shù)調(diào)用,在棧上就會(huì)生成一個(gè)棧框(stack frame),也就是一個(gè)數(shù)據(jù)
單元用來描述該函數(shù),描述函數(shù)的地址,參數(shù),還有函數(shù)的局部變量的值等信息。
使用bt命令就可以把這個(gè)棧的調(diào)用信息全部顯示出來。
由上面的顯示結(jié)果可以看出,棧上有兩個(gè)棧框(stack frame),分別用來描述函數(shù) main和函數(shù)sum.前面的#0表示sum函數(shù)棧框的標(biāo)號(hào)。#1表示main函數(shù)棧框的標(biāo)號(hào)。 最新的棧框標(biāo)號(hào)為0.main函數(shù)棧框標(biāo)號(hào)最大。
(gdb) frame 1 #1 0x08048418 in main () at sum.c:16 16 ret = sum(m,n); frame 1 表示選擇棧框1,也就是選擇了main函數(shù)的棧框,因?yàn)槲疫@時(shí)候想查看
main函數(shù)的信息。
(gdb)?info locals
m?=?10
n?=?9
ret?=?0 這時(shí)候可以通過info locals查看main函數(shù)棧框里面局部變量的值。
-----------------------------------------------------------------------------------
二,使用gdb堆棧跟蹤很方面調(diào)試遞歸程序。
#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使用手冊(cè)上有一塊專門說如何查看堆棧,翻譯后的文檔如下:
?gdb查看堆棧.rar??? ----------------------------------------------------------------------------------
參考:?http://www.ibm.com/developerworks/cn/linux/sdk/gdb/index.html? 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
---------------------------------------------------------------------------------
一,簡單實(shí)例。
單元用來描述該函數(shù),描述函數(shù)的地址,參數(shù),還有函數(shù)的局部變量的值等信息。
使用bt命令就可以把這個(gè)棧的調(diào)用信息全部顯示出來。
由上面的顯示結(jié)果可以看出,棧上有兩個(gè)棧框(stack frame),分別用來描述函數(shù) main和函數(shù)sum.前面的#0表示sum函數(shù)棧框的標(biāo)號(hào)。#1表示main函數(shù)棧框的標(biāo)號(hào)。 最新的棧框標(biāo)號(hào)為0.main函數(shù)棧框標(biāo)號(hào)最大。
-----------------------------------------------------------------------------------
二,使用gdb堆棧跟蹤很方面調(diào)試遞歸程序。
---------------------------------------------------------------------------------
三,gdb使用手冊(cè)上有一塊專門說如何查看堆棧,翻譯后的文檔如下:
?gdb查看堆棧.rar??? ----------------------------------------------------------------------------------
參考:?http://www.ibm.com/developerworks/cn/linux/sdk/gdb/index.html? 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的gdb调试之堆栈跟踪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。