减lessdebugging会话中的堆栈大小,以捕捉无穷的recursion

我有一个algorithm,“有时”不会中断recursion,并在堆栈溢出结束。 现在我想debugging这种情况。 gdb直接指向我覆盖堆栈寄存器的那一行,但是不可能得到堆栈跟踪,因为gdb需要无尽的时间来展开堆栈并将其显示在ddd中。

我现在只是想减less堆栈大小,以早日获得腐败。 所以我需要一种方法来减less为我的运行任务堆栈。 没有涉及的线程,所以不应该这么大。

但我不知道如果gdb本身有一个操纵堆栈(大小)本身的选项,或者我需要编程改变我的编程开始时的大小,或者我可以减less从OS命令行(linux)开始后的大小debugging会话。

如果gdb有这样一个选项,如果调用树达到最大深度,也许也可以停止。

尝试在你运行你的程序的shell中使用ulimit -s (stack_size),或者你可以通过编程的方式来使用GNU编译器编译期间在Linux中改变C ++应用程序的堆栈大小

编辑:

我们可以编写简单的nohup类程序,它将SIGSTOP发送给自己,并执行它的参数。 我们把它命名为runpaused

 //runpaused.c #include <signal.h> #include <unistd.h> int main(int argc, char **argv) { raise(SIGSTOP); return execvp(argv[1], argv+1); } 

比起来,我们可以做下一件事情:编译runpaused

 $ gcc runpaused.c -o runpaused 

限制当前shell的堆栈

 $ ulimit -s 32 

通过runpaused运行我们的程序,以sh为例

 $ ./runpaused sh -c "echo Hello" 

从其他终端:找到它的PID

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

用我们的程序加载gdb

 $ gdb $(which sh) 

附加到PID

 (gdb) attach PID 

gdb发送信号SIGCONT

 (gdb) signal SIGCONT 

继续从gdb执行程序

 (gdb) continue 

经过几次继续,我们得到我们想要的。