ulimit 设置正确的分段错误

Segmentation fault with ulimit set correctly

我试图在 上帮助 OP。

我发现即使堆栈设置为 2000 KB,类似下面的代码也会随机导致分段错误。

int main ()
{
   int a[510000];
   a[509999] = 1;
   printf("%d", a[509999]);
   return 0;
}

如您所见,数组是 510000 x 4 字节 = 2040000 字节。

使用 ulimit 命令将堆栈设置为 2000 KB(2048000 字节):

根据这些数字,应用程序有存储数组的空间,但随机 return 分段错误。

有什么想法吗?

如果您仍想访问数组中的 int 位置,请尝试在没有 main 的情况下编译代码。这将不会调用 _start

查看此讨论

有几个原因导致您无法执行此操作。有些东西已经在使用你的部分堆栈。

main 不是您堆栈中的第一件事。在 main 之前有真正的入口点、动态链接器等调用的函数,它们可能都在使用一些堆栈。

此外,通常可以将一些东西放在堆栈的顶部以设置执行。我知道的许多系统将所有字符串放在 argv 中,并将所有环境变量放在堆栈顶部(这就是为什么 main 不是入口点,通常在 main 之前 运行s 的代码设置环境变量和 argv主要)。

最重要的是,如果您的系统这样做,可以故意浪费一部分堆栈来增加 ASLR 的随机性。

运行 您在调试器中编程,在 main 处添加一个断点,查找堆栈寄存器的值并检查其上方的内存(请记住,除非您在一个奇怪的架构)。我打赌你会在那里找到很多指针和字符串。我只是在 linux 系统上执行此操作,因为我怀疑我所有的环境变量都在那里。

Unix 上资源限制 (ulimit) 的目的从来都不是真正将事情细化到 byte/microsecond,它们的存在只是为了阻止你的程序完全疯狂并让整个系统崩溃它。不要将它们视为正确道路上的红灯和停车标志,而应将它们视为赛道上的 运行- 禁区和防撞栏。