【问题标题】:Can't find my segmentation fault in my malloc shared library在我的 malloc 共享库中找不到我的分段错误
【发布时间】:2018-10-25 10:52:03
【问题描述】:

我使用 mmap 和 munmap 在 c 中重新编码了 malloc free 和 realloc。我将它们编译为共享库 .so 文件。

这是一个简单的测试:

#include <stdlib.h>

int main() {
    int i;
    char *addr;
    i = 0;
    while (i < 1024)
    {
        addr = (char*)malloc(1024);
        addr[0] = 42;
        i++;
    }
    return (0);
}

这是一个 run.sh,它必须用我的共享库替换 stdlib:

#/bin/sh
export DYLD_LIBRARY_PATH=.
export DYLD_INSERT_LIBRARIES="libft_malloc.so"
export DYLD_FORCE_FLAT_NAMESPACE=1
$@

问题是,当我使用共享库直接编译测试文件并替换其中的标头时,它运行良好:

-> gcc test1.c libft_malloc.so
-> ./a.out
-> no error

但是当我使用 run.sh 运行它时,它应该只用我的 libft_malloc.so 文件替换官方 malloc 库,我得到一个段错误:

-> gcc test1.c
-> ./run.sh ./a.out
-> ./run.sh: line 5: 73502 Segmentation fault: 11  $@

我知道错误出在我的代码中,而不是在 run.sh 或 test.c 中,因为它们是我必须用来在学校测试我的库的官方文件,并且这些文件在其他 malloc 存储库中运行良好,但我找不到问题所在。

这是我的存储库:https://github.com/Shirakawa42/malloc.git

我尝试通过在任何地方放置 write() 来进行调试,但段错误似乎不在 malloc 中,所以我迷路了。

编辑: 如果我们在没有任何 malloc 的情况下运行测试,而只是通过加载我的库,也会出现段错误:

#include <stdlib.h>

int main() {
    int i;
    i = 0;
    while (i < 1024)
    {
        i++;
    }
    return (0);
}

-> gcc test1.c
-> ./run.sh ./a.out
-> ./run.sh: line 5: 74764 Segmentation fault: 11  $@

编辑 2: 使用flag fsanitize=address 编译修复segfault,但绝对不是最优的

编辑 3: 在 shell 中手动设置 2 first export 告诉我:

dyld: warning: could not load inserted library 'libft_malloc.so' into library validated process because no suitable image found.  Did find:
    libft_malloc.so: code signing blocked mmap() of 'libft_malloc.so'

在设置第三个导出后,我的所有操作都让我出现段错误,比如 ls 和 vim,cd 让我中止

【问题讨论】:

  • “我尝试通过将 write() 放置在任何地方进行调试”尝试在 gdb 中运行它?
  • 我没有尝试过 gdb 我实际上正在尝试但这是我的第一次
  • 看起来我不能使用 gdb 有 ./run.sh ./test 没有被识别为可执行文件
  • 直接运行 ./test - 在你的 shell 中设置你的环境变量,这样你就不需要使用 run.sh 包装器了。
  • 环境是什么? macOS、Xcode?看看这个:stackoverflow.com/questions/26024100/…

标签: c memory-management segmentation-fault shared-libraries mmap


【解决方案1】:
dyld: warning: could not load inserted library 'libft_malloc.so' into library validated process because no suitable image found.  Did find:
    libft_malloc.so: code signing blocked mmap() of 'libft_malloc.so'

当您的 malloc 或 free 中存在段错误时会附加此错误,修复 free 使其工作。

【讨论】:

    【解决方案2】:

    你可以在 gdb 中调试它。首先使用调试选项构建您的代码:

    gcc -g -O0 
    

    以上选项应该同时用于您的 lib 和测试程序。然后你可以尝试在 gdb 中运行你的程序:

    gdb a.out
    (gdb) r <arguments to a.out>
    (gdb) bt     <-- when it crashes
    

    Linux 将您的程序加载到内存中并调用入口点main。编译器为平台添加的启动代码可能会调用malloc。因此,在您的测试代码中没有malloc 的崩溃。

    【讨论】:

    • 我编辑了我的问题,加载库时出现了段错误,所以我无法像那样测试 gdb
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2012-06-22
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多