无法调试使我的Shell segfault的.so库

时间:2018-09-15 11:10:53

标签: c unix segmentation-fault malloc mmap

我正在尝试使用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;

1 个答案:

答案 0 :(得分:1)

  

我不太了解为什么它不起作用以及如何调试它。

通常的调试方法是让程序转储Path Duration [minutes] --------------------------------- A->B->E->F 100 A->C->D->F 50 core),然后使用调试器 look 进行无限递归。

如果我猜到了,我会猜想当动态加载程序尝试解决从ulimit -c unlimitedmalloc的调用时,此动态符号解析本身需要动态内存并致电init_glob

如果提供MCVE(包括构建说明),将会得到更好的答案(更少的猜测)。