在我的 malloc 共享库中找不到我的分段错误
Can't find my segmentation fault in my malloc shared library
我使用 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,必须用我的共享库替换标准库:
#/bin/sh
export DYLD_LIBRARY_PATH=.
export DYLD_INSERT_LIBRARIES="libft_malloc.so"
export DYLD_FORCE_FLAT_NAMESPACE=1
$@
问题是当我用我的共享库直接编译测试文件并替换其中的 header 时,它运行良好:
-> 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:
使用标志 fsanitize=address 编译修复段错误,但它绝对不是最优的
编辑 3:
在 shell 中手动设置 2 第一次导出告诉我:
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 使我中止
你可以在gdb中调试它。首先使用调试选项构建代码:
gcc -g -O0
以上选项应该用于您的库和测试程序。然后你可以尝试 运行 你在 gdb 中编程:
gdb a.out
(gdb) r <arguments to a.out>
(gdb) bt <-- when it crashes
Linux 将您的程序加载到内存中并调用入口点 main
。编译器为平台添加的启动代码可能会调用 malloc
。因此,在您的测试代码中没有 malloc
的崩溃。
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 使其工作。
我使用 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,必须用我的共享库替换标准库:
#/bin/sh
export DYLD_LIBRARY_PATH=.
export DYLD_INSERT_LIBRARIES="libft_malloc.so"
export DYLD_FORCE_FLAT_NAMESPACE=1
$@
问题是当我用我的共享库直接编译测试文件并替换其中的 header 时,它运行良好:
-> 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: 使用标志 fsanitize=address 编译修复段错误,但它绝对不是最优的
编辑 3: 在 shell 中手动设置 2 第一次导出告诉我:
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 使我中止
你可以在gdb中调试它。首先使用调试选项构建代码:
gcc -g -O0
以上选项应该用于您的库和测试程序。然后你可以尝试 运行 你在 gdb 中编程:
gdb a.out
(gdb) r <arguments to a.out>
(gdb) bt <-- when it crashes
Linux 将您的程序加载到内存中并调用入口点 main
。编译器为平台添加的启动代码可能会调用 malloc
。因此,在您的测试代码中没有 malloc
的崩溃。
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 使其工作。