减少调试会话中的堆栈大小以捕获无限递归

时间:2016-02-20 11:59:15

标签: c++ linux recursion gdb stack-overflow

我有一个算法,“有时”没有破坏递归并最终导致堆栈溢出。现在我想调试那种情况。 gdb直接指向我覆盖堆栈边界的行,但是不可能获得堆栈跟踪,因为gdb需要无休止的时间来展开堆栈并在ddd中显示它。

我现在只想减少堆栈大小以更早地获得损坏。所以我需要一种方法来减少堆栈以适应我的运行任务。没有线程涉及所以它应该没那么重要。

但是我不知道gdb本身是否有一个操作堆栈(大小)本身的选项,或者我需要在我的prog开始时编程更改大小,或者我可以从os命令行(linux)减小大小在启动调试会话之后。

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

1 个答案:

答案 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

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