我有一个算法,“有时”没有破坏递归并最终导致堆栈溢出。现在我想调试那种情况。 gdb直接指向我覆盖堆栈边界的行,但是不可能获得堆栈跟踪,因为gdb需要无休止的时间来展开堆栈并在ddd中显示它。
我现在只想减少堆栈大小以更早地获得损坏。所以我需要一种方法来减少堆栈以适应我的运行任务。没有线程涉及所以它应该没那么重要。
但是我不知道gdb本身是否有一个操作堆栈(大小)本身的选项,或者我需要在我的prog开始时编程更改大小,或者我可以从os命令行(linux)减小大小在启动调试会话之后。
如果gdb有这样的选项,如果调用树达到最大深度,也许也可能停止。
答案 0 :(得分:4)
尝试在运行程序的shell中使用ulimit -s
(stack_size),或者可以通过编程方式执行Change stack size for a C++ application in Linux during compilation with GNU compiler
编辑:
我们可以编写简单的类似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
从SIGCONT
gdb
(gdb) signal SIGCONT
从gdb
(gdb) continue
经过几次继续,我们得到了我们想要的东西。