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

Kla*_*aus 4 c++ linux stack-overflow recursion gdb

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

我现在只想减少堆栈大小以更早地获得损坏。所以我需要一种方法来减少我正在运行的任务的堆栈。不涉及任何线程,因此应该不是什么大问题。

但我不知道 gdb 本身是否有一个选项来操纵堆栈(大小)本身,或者我需要在程序启动时以编程方式更改大小,或者我可以在启动后从操作系统命令行(linux)减小大小调试会话。

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

use*_*083 5

ulimit -s尝试在运行程序的 shell 中使用(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);
}
Run Code Online (Sandbox Code Playgroud)

然后,我们可以做接下来的事情:compile runpaused

$ gcc runpaused.c -o runpaused
Run Code Online (Sandbox Code Playgroud)

当前 shell 的限制堆栈

$ ulimit -s 32
Run Code Online (Sandbox Code Playgroud)

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

$ ./runpaused sh -c "echo Hello"
Run Code Online (Sandbox Code Playgroud)

从其他终端:找到它PID

$ ps -ef | grep -v grep | grep runpaused
Run Code Online (Sandbox Code Playgroud)

使用我们的程序加载 gdb

$ gdb $(which sh)
Run Code Online (Sandbox Code Playgroud)

附加到PID

(gdb) attach PID
Run Code Online (Sandbox Code Playgroud)

发送信号SIGCONTgdb

(gdb) signal SIGCONT
Run Code Online (Sandbox Code Playgroud)

继续执行程序gdb

(gdb) continue
Run Code Online (Sandbox Code Playgroud)

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

  • 要仅在目标中设置 ulimit,请尝试 `(gdb) set exec-wrapper sh -c 'ulimit -s 32;exec "$0" "$@"'` 。有关“exec-wrapper”语义的更多信息[此处](http://stackoverflow.com/a/27510210/2554472)。 (4认同)