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 字节):
- ulimit -s 2000
- ulimit -Ss 2000
根据这些数字,应用程序有存储数组的空间,但随机 return 分段错误。
有什么想法吗?
如果您仍想访问数组中的 int 位置,请尝试在没有 main 的情况下编译代码。这将不会调用 _start
查看此讨论
有几个原因导致您无法执行此操作。有些东西已经在使用你的部分堆栈。
main
不是您堆栈中的第一件事。在 main 之前有真正的入口点、动态链接器等调用的函数,它们可能都在使用一些堆栈。
此外,通常可以将一些东西放在堆栈的顶部以设置执行。我知道的许多系统将所有字符串放在 argv 中,并将所有环境变量放在堆栈顶部(这就是为什么 main 不是入口点,通常在 main 之前 运行s 的代码设置环境变量和 argv主要)。
最重要的是,如果您的系统这样做,可以故意浪费一部分堆栈来增加 ASLR 的随机性。
运行 您在调试器中编程,在 main 处添加一个断点,查找堆栈寄存器的值并检查其上方的内存(请记住,除非您在一个奇怪的架构)。我打赌你会在那里找到很多指针和字符串。我只是在 linux 系统上执行此操作,因为我怀疑我所有的环境变量都在那里。
Unix 上资源限制 (ulimit) 的目的从来都不是真正将事情细化到 byte/microsecond,它们的存在只是为了阻止你的程序完全疯狂并让整个系统崩溃它。不要将它们视为正确道路上的红灯和停车标志,而应将它们视为赛道上的 运行- 禁区和防撞栏。
我试图在
我发现即使堆栈设置为 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
根据这些数字,应用程序有存储数组的空间,但随机 return 分段错误。
有什么想法吗?
如果您仍想访问数组中的 int 位置,请尝试在没有 main 的情况下编译代码。这将不会调用 _start
查看此讨论
有几个原因导致您无法执行此操作。有些东西已经在使用你的部分堆栈。
main
不是您堆栈中的第一件事。在 main 之前有真正的入口点、动态链接器等调用的函数,它们可能都在使用一些堆栈。
此外,通常可以将一些东西放在堆栈的顶部以设置执行。我知道的许多系统将所有字符串放在 argv 中,并将所有环境变量放在堆栈顶部(这就是为什么 main 不是入口点,通常在 main 之前 运行s 的代码设置环境变量和 argv主要)。
最重要的是,如果您的系统这样做,可以故意浪费一部分堆栈来增加 ASLR 的随机性。
运行 您在调试器中编程,在 main 处添加一个断点,查找堆栈寄存器的值并检查其上方的内存(请记住,除非您在一个奇怪的架构)。我打赌你会在那里找到很多指针和字符串。我只是在 linux 系统上执行此操作,因为我怀疑我所有的环境变量都在那里。
Unix 上资源限制 (ulimit) 的目的从来都不是真正将事情细化到 byte/microsecond,它们的存在只是为了阻止你的程序完全疯狂并让整个系统崩溃它。不要将它们视为正确道路上的红灯和停车标志,而应将它们视为赛道上的 运行- 禁区和防撞栏。