【发布时间】:2015-09-26 09:17:35
【问题描述】:
我试图帮助this question 上的 OP。
我发现即使堆栈设置为 2000 KB,像下面这样的代码也会随机导致分段错误。
int main ()
{
int a[510000];
a[509999] = 1;
printf("%d", a[509999]);
return 0;
}
如您所见,数组为510000 x 4 bytes = 2040000 bytes。
使用 ulimit 命令将堆栈设置为 2000 KB(2048000 字节):
- ulimit -s 2000
- ulimit -Ss 2000
基于这些数字,应用程序有空间存储数组,但随机返回分段错误。
有什么想法吗?
【问题讨论】:
-
也许stdio的数据结构应该与环境等一起考虑
-
@EdHeal 你能详细说明一下吗?
-
这取决于实现,在您的情况下,程序确实使用了 stdio 库。可以在 main 被命中之前使用堆栈来存储东西。这可能包括
atexit等的指针。 -
@EdHeal 我明白,但那东西可能超过 8000 字节吗?
-
@EdHeal:在
main的条目上使用一些内联汇编打印出rsp寄存器的值。通过这种方式,您可以确定到目前为止已使用了多少堆栈。
标签: c segmentation-fault stack