减少调试会话中的堆栈大小以捕获无休止的递归
reduce stack size in debug session to catch endless recursion
我有一个算法 "sometimes" 没有破坏递归并最终导致堆栈溢出。现在我想调试那种情况。 gdb 将我直接指向覆盖堆栈边界的行,但是获取堆栈跟踪是不可能的os,因为 gdb 需要无穷无尽的时间来展开堆栈并将其显示在 ddd 中。
我现在只想减少堆栈大小,以便更早地进行损坏。所以我需要一种方法来减少我的 运行 任务的堆栈。没有涉及线程,所以应该没什么大不了的。
但我不知道 gdb 本身是否有一个选项来操纵堆栈(大小)本身,或者我需要在程序开始时以编程方式更改大小,或者我可以从 os 启动调试会话后的命令行 ( linux )。
如果 gdb 有这样的选项,如果调用树达到最大深度,也许它也是 possible 停止。
尝试在 shell 中使用 ulimit -s
(stack_size) 您 运行 您的程序,或者您可以通过编程方式进行 Change stack size for a C++ application in Linux during compilation with GNU compiler
编辑:
我们可以编写简单的类似 nohup 的程序,它向自己发送 SIGSTOP
,然后执行它的参数。我们将其命名为 运行paused
//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
运行 我们的程序通过 运行 暂停,以 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
几经不断,如愿以偿
我有一个算法 "sometimes" 没有破坏递归并最终导致堆栈溢出。现在我想调试那种情况。 gdb 将我直接指向覆盖堆栈边界的行,但是获取堆栈跟踪是不可能的os,因为 gdb 需要无穷无尽的时间来展开堆栈并将其显示在 ddd 中。
我现在只想减少堆栈大小,以便更早地进行损坏。所以我需要一种方法来减少我的 运行 任务的堆栈。没有涉及线程,所以应该没什么大不了的。
但我不知道 gdb 本身是否有一个选项来操纵堆栈(大小)本身,或者我需要在程序开始时以编程方式更改大小,或者我可以从 os 启动调试会话后的命令行 ( linux )。
如果 gdb 有这样的选项,如果调用树达到最大深度,也许它也是 possible 停止。
尝试在 shell 中使用 ulimit -s
(stack_size) 您 运行 您的程序,或者您可以通过编程方式进行 Change stack size for a C++ application in Linux during compilation with GNU compiler
编辑:
我们可以编写简单的类似 nohup 的程序,它向自己发送 SIGSTOP
,然后执行它的参数。我们将其命名为 运行paused
//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
运行 我们的程序通过 运行 暂停,以 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
几经不断,如愿以偿