ulimit设置正确的分段错误

时间:2015-07-08 12:43:01

标签: c segmentation-fault stack

我试图在this question上帮助OP。

我发现下面的代码会导致分段错误,即使堆栈设置为2000 KB也是如此。

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

如您所见,该数组为510000 x 4 bytes = 2040000字节。

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

  • ulimit -s 2000
  • ulimit -Ss 2000

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

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

有几个原因导致你无法做到这一点。有些东西已经在使用你的部分堆栈了。

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

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

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

在调试器中运行程序,在main处添加断点,查找堆栈寄存器的值并检查其上方的内存(请记住,除非您使用的是奇怪的架构,否则堆栈最有可能会增长)。我打赌你会在那里找到很多指针和字符串。我刚刚在linux系统上做了这个,因为我怀疑我的所有环境变量都在那里。

Unix上的资源限制(ulimit)的目的从来没有真正地将事情微观管理到一个字节/微秒,它们只是为了阻止你的程序完全疯狂并用它取下整个系统。看到它们不是红灯,在正确的道路上停下标志,将它们视为跑道区域和赛道上的防撞栏。

答案 1 :(得分:0)

如果您仍想访问数组中的int位置,请尝试使用main来编译代码。这不会调用Selection

查看此讨论enter link description here