gpt4 book ai didi

c - brk() 上的 Bash 脚本段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:10 27 4
gpt4 key购买 nike

有人可以解释为什么这个“无休止的”循环会很快出现段错误吗?例如,假设我们有这个功能:

#!/bin/bash

foo() {
foo
}; foo

8-10 秒后出现段错误。通过 strace 检查,我们可以看到很多 brk() 调用:

brk(0x2e11000)                          = 0x2e11000
brk(0x2e12000) = 0x2e12000
brk(0x2e13000) = 0x2e13000
brk(0x2e14000) = 0x2e14000
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7ffcddf5ff68} ---
+++ killed by SIGSEGV +++
Segmentation fault

我的问题是:

  1. 这是段错误是因为它试图访问内存空间中未映射的区域(通过 brk)吗?
  2. 如果是,为什么要尝试访问它?
  3. 这里 malloc() 是更好的选择吗?
  4. 如果您对此有任何额外/琐碎的信息,我们将不胜感激。

最佳答案

  1. brk 不相关。它会出现段错误,因为它用完了堆栈空间。如果使用 ulimit -s 512 减少可用堆栈; ./yourscript 你会发现它崩溃得更快。

  2. 它吞噬了所有堆栈空间,因为您有一个无限递归函数,而 bash 不进行尾调用优化。

  3. 它已经使用了 malloc(或其特定于 bash 的版本)。由于 malloc 是 C 库函数而不是系统调用,因此它不会出现在 strace 中。虽然分配的内存没有问题,但堆栈空间已用完。

  4. brk 用于存储一些与您的无限递归相关的无限元数据,但这还不够重要。

    当您拥有未优化的无限递归时,无限递归函数的崩溃会以各种形式在所有语言中发生。试试 void foo() { foo(); 在 Java 中,或 def foo(): foo() 在 Python 中。

关于c - brk() 上的 Bash 脚本段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48010943/

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