2016-02-20 17 views
2

我有一個「有時」不會中斷遞歸併以堆棧溢出結束的算法。現在我想調試這種情況。 gdb直接指向我覆蓋堆棧寄存器的那一行,但不可能獲得堆棧跟蹤,因爲gdb需要無盡的時間來展開堆棧並將其顯示在ddd中。在調試會話中減少堆棧大小以捕捉無盡的遞歸

我現在只是想減少堆棧大小以便早日獲得腐敗。所以我需要一種方法來減少爲我的運行任務堆棧。沒有涉及的線程,所以它不應該是這樣。

但我不知道如果gdb本身有一個操縱堆棧(大小)本身的選項,或者我需要在編程開始時編程改變大小,或者我可以減小os命令行的大小(linux )開始調試會話後。

也許如果gdb有這樣的選項,如果調用樹達到最大深度,也可以停止。

回答

4

嘗試,你運行你的程序使用ulimit -s(STACK_SIZE)在外殼或可以以編程方式做到這一點Change stack size for a C++ application in Linux during compilation with GNU compiler

編輯:

我們可以寫簡單的nohup般的方案,該方案送SIGSTOP本身,並執行它的參數。通過runpaused,使用SH作爲當前shell

$ ulimit -s 32 

編譯runpaused

$ gcc runpaused.c -o runpaused 

極限堆運行我們的程序:讓我們將其命名爲runpaused

//runpaused.c 
#include <signal.h> 
#include <unistd.h> 

int main(int argc, char **argv) 
{ 
    raise(SIGSTOP); 
    return execvp(argv[1], argv+1); 
} 

比,我們可以做接下來的事情就示例

$ ./runpaused sh -c "echo Hello" 

從其他終端: 發現它PID

$ ps -ef | grep -v grep | grep runpaused 

負載GDB我們的計劃

$ gdb $(which sh) 

重視PID

(gdb) attach PID 

發送信號SIGCONTgdb

(gdb) signal SIGCONT 

繼續從gdb

(gdb) continue 

程序執行後繼續的幾次,我們得到了我們想要的東西。

+0

使用ulimit -s不能提供幫助,因爲這會影響調試會話,而不僅僅是應該調試的程序。有沒有機會從gdb設置ulimit -s?但是,以編程方式減少堆棧大小的鏈接適合我的問題。也許你可以改變你的答案給其他用戶。 – Klaus

+0

我更新了我的答案 – user2807083

+1

要僅在目標中設置ulimit,請嘗試使用'(gdb)set exec-wrapper sh -c'ulimit -s 32; exec「$ 0」「$ @」'''。更多關於'exec-wrapper'的語義[這裏](http://stackoverflow.com/a/27510210/2554472)。 –

相關問題