2010-10-06 45 views
14

任何人都可以給我一個快速的概述/指向我的文件的方式來檢查C程序的堆棧(和堆?)?我認爲這應該用GDB來完成,但是如果還有其他更直接的選擇,那也應該是好的。如何使用gdb來探索堆棧/堆?

謝謝。

+0

你用什麼操作系統? – 2010-10-06 17:11:38

+0

啊,對不起,是的:操作系統:Ubuntu Linux,編譯器:GCC。 – 2010-10-06 17:13:22

回答

2

我使用GDB進行調試的第一種方法是設置斷點。這是這樣做的 -

prompt> gdb ./x_bstree.c 
(gdb) #prompt 
(gdb) b 123 #break at line 123 
(gdb) r #start program 

現在你的程序停在你的程序的第123行。現在,您可以使用print來檢查堆棧或堆中的變量。對於堆棧變量,只需使用print <varname>。對於堆變量(指針)使用print <*varname>。不確定檢查堆棧/堆變量有什麼特別的事情嗎?

當然,要調試多線程應用程序,您需要使它在單線程模式下運行&然後dubug否則很難預測發生了什麼。

爲別的存在的gdb &許多網站大量的文檔還提供gdb cheat sheets

3

嘗試使用dddddd manual

好的。也許我稍微說一下。我這樣使用它。

編好的程序編譯與調試符號:

gcc -g program.c -o program 

運行ddd

ddd program 

在GUI中,你可以做各種事情,查看機器代碼,查看內存等。環視四周。 手冊中還有一部分檢查堆棧。 ddd爲您提供了很好的界面,用於檢查C程序 。

+0

我以爲ddd只是gdb的前端,不是嗎? – 2010-10-06 18:19:25

+0

我發現它比gdb更方便。在gui中,您可以一次查看幾件事情。在gdb中,我一直在回滾。 – 2010-10-06 18:40:14

+0

這只是gdb的前端,請參見[更新的手動位置](http://www.gnu.org/software/ddd/manual/html_mono/ddd.html)。但是,對於某些類型的工作流程而言,它可以比僅用於控制檯的工具更直接。 – starturtle 2016-08-03 12:15:28

12

您可以用「X」命令轉儲原始內存

所以如果你想看看堆棧位或堆嘗試像

x/10b &stackvar 
x/200b &heapvar-20 

事情最後一個會告訴你200個字節從heapvar之前的20個字節開始。所以,如果你只是malloced,你可以看到堆頭太

+0

我喜歡你的方法!是否有任何好的gdb插件允許檢查堆顯示它的塊數據,標題,使用位等?我剛剛找到[gdb-heap](https://fedorahosted.org/gdb-heap/)。不幸的是,它看起來很不合時宜,無人維護。 – rc0r 2015-08-25 06:02:46

0

查看堆棧: gdb> backtrace

查看當前棧幀: gdb> info frame

查看當前堆棧幀的參數: gdb> info args

查看當前堆棧幀的局部變量: gdb> info locals

導航到父堆棧幀: gdb> frame 1

Examining the Stack