gpt4 book ai didi

c++ - 减少调试 session 中的堆栈大小以捕获无休止的递归

转载 作者:太空狗 更新时间:2023-10-29 11:42:50 32 4
gpt4 key购买 nike

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

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

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

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

最佳答案

尝试在运行程序的 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);
}

接下来,我们可以做以下事情:编译运行暂停

$ 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

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

关于c++ - 减少调试 session 中的堆栈大小以捕获无休止的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522918/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com