gpt4 book ai didi

c - ulimit 设置正确的段错误

转载 作者:行者123 更新时间:2023-12-01 03:08:36 27 4
gpt4 key购买 nike

我试图在 this question 上帮助 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 字节):

  • ulimit -s 2000
  • ulimit -Ss 2000

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

有什么想法吗?

最佳答案

您不能这样做的原因有几个。有些东西已经在使用您的部分堆栈。

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

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

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

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

Unix 上资源限制 (ulimit) 的目的从来都不是真正将事情微观管理到字节/微秒,它们只是为了阻止你的程序完全疯狂并用它来摧毁整个系统。不要将它们视为正确道路上的红灯和 parking 标志,而应将它们视为跑道上的径流区和防撞栏。

关于c - ulimit 设置正确的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31293068/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com