如果我们在获得SIGSEGV后可以增加正在运行的程序的堆栈大小,我试图找出任何方法。我知道我们可以通过ulimit -c增加堆栈的大小但是,这并没有解决这个问题。因为我的过程已经死了。我想处理这种情况,即使在segfault之后我的进程也不会被杀死。 setrlimit()是一种静态超出堆栈大小的方法。但我不想阻止比我需要更多的记忆。
答案 0 :(得分:3)
在Linux下,为堆栈大小设置更高的限制不会将此内存提交给您的进程。内存将根据需要进行分页。
默认堆栈大小已经很大了。您应该在调试器下运行或在SIGSEGV上生成一个核心来分析实际情况。您可能会通过错误分配的VLA进行非常深的递归或过多的局部变量空间。增加堆栈空间可能会暂时隐藏问题,但这不是一个可靠的解决方案。
答案 1 :(得分:1)
最近的操作系统不会自动为堆栈保留内存,而只是根据需要添加页面。 ulimit只是一个允许它用完的上限。因此,静态增加堆栈大小应该没有问题,而且正是您想要的。