日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gdb调试之堆栈跟踪

發布時間:2025/6/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的gdb调试之堆栈跟踪的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。