2016-02-20 18 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)。 –

相关问题