我正在尝试使用C语言(使用mmap)使 malloc ,免费和 realloc 功能。
我正在使用以下命令行将它们包括在我的shell中(我正在使用sh):
export DYLD_LIBRARY_PATH=.
export DYLD_FORCE_FLAT_NAMESPACE=1
export DYLD_INSERT_LIBRARIES="./malloc.so:./free.so:./realloc.so"
这是我的一些malloc代码:
#include "../incs/malloc.h"
void *malloc(size_t size)
{
write(2, "\nMALLOC", 7);
t_block *res;
write(2, "0", 1);
res = NULL;
if (!(glob))
{
write(2, "1", 1);
// First call of malloc, need to init glob variable
glob = init_glob();
}
write(2, "2", 1);
res = get_block(size);
write(2, "3", 1);
if (!res)
return (NULL);
write(2, "4", 1);
return (res->memory);
}
在我的init_glob()函数开始处也有一个调试写。
当我在shell中执行前面的命令行并运行一个随机命令(例如ls)时,这就是我得到的:
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01
MALLOC01Segmentation fault: 11
我不太了解为什么它不起作用以及如何调试它。
它应该只写一次“ MALLOC01”,十点进入我的init_glob函数。 为什么这样循环? 我怎么能看到它在ls命令中崩溃了?
谢谢。
=====编辑=====
这是我的init_glob()函数:
#include "../incs/malloc.h"
/*
** This function returns a t_glob.
** It shall init the global variable of type t_glob, on the first time
** malloc is called in a process.
*/
t_glob *init_glob(void)
{
write(2, "a", 1);
t_glob *res;
res = NULL;
write(2, "b", 1);
res = (t_glob *)allocate_memory(sizeof(t_glob));
write(2, "c", 1);
res->tiny = NULL;
res->small = NULL;
res->large = NULL;
write(2, "d", 1);
return (res);
}
还有我的allocate_memory()函数(但似乎程序甚至没有去那里):
void *allocate_memory(size_t size)
{
void *res;
res = NULL;
res = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
return (res);
}
我的t_glob结构的原型如下:
typedef struct s_glob
{
t_page *tiny;
t_page *small;
t_page *large;
// size_t sizeof_block; // Avoid repeat of sizeof() call
// size_t sizeof_page;
// size_t getpagesize_result;
} t_glob;
答案 0 :(得分:1)
我不太了解为什么它不起作用以及如何调试它。
通常的调试方法是让程序转储Path Duration [minutes]
---------------------------------
A->B->E->F 100
A->C->D->F 50
(core
),然后使用调试器 look 进行无限递归。
如果我猜到了,我会猜想当动态加载程序尝试解决从ulimit -c unlimited
到malloc
的调用时,此动态符号解析本身需要动态内存并致电init_glob
。
如果提供MCVE(包括构建说明),将会得到更好的答案(更少的猜测)。