【问题标题】:Kmemleak false positivesKmemleak 误报
【发布时间】:2022-08-12 18:04:42
【问题描述】:

我正在尝试使用 kmemleak 来确保我的软件没有任何内存泄漏,但我遇到了该工具报告大量误报的问题。问题是我的应用程序没有明确分配/释放内存,而是使用内存池。让 kmemleak 感到困惑的是分配器(我所说的分配器是指负责管理内存池的对象)不会返回指向已分配内存的指针,而是返回其成员之一。不返回整个分配对象的要点是从内存池分配的每个元素都关联了几个字节的元数据,我不希望内存使用者知道这些额外的字节。释放元素时,分配器可以通过使用container_of() 宏轻松恢复最初分配的内存地址。它是这样工作的:

struct element {
    uint8_t allocator_metadata_1;
    uint16_t allocator_metadata_2;
    char[] data;
}

void *allocate_element(void *mempool) {
    struct element *new_elem;
    new_elem = get_free_element_from_mempool(mempool);
    return new_elem->data;
}

void free_element(void *mempool, void *element_to_remove) {
    struct element *elem;
    elem = container_of(element_to_remove, struct element, data);
    return_element_to_mempool(mempool, elem);
}

为了使示例尽可能简单,让我们假设 get_free_element_from_mempool() return_element_to_mempool() 是管理从/到 mempool 检索/返回内存并在 allocator_metadata_1 和 allocator_metadata_2 字段上操作的函数。

因此,正如您所见,在使用element 时,任何人都没有指向一些内存字节,但是感谢container_of() 宏,这并不意味着该内存丢失了。

我的问题是是否可以让 kmemleak 知道它应该以不同于常规内存分配的方式从内存池中跟踪这些元素?

  • 为您使用 kmemleak风俗分配器,您需要以某种方式教该工具将您的功能视为分配/解除分配。您究竟是如何教该工具有关您的功能的?

标签: c memory-leaks kernel memory-pool


【解决方案1】:

事实证明,kmemleak 可以使用自定义内存池。我必须做的是在设置内存池期间分配的每个struct element 上调用kmemleak_free()(我的意思是在内存池中填充空元素的那一刻)。这样,kmemleak 就不再跟踪这个内存了。然后我以下列方式扩展了allocate_element()free_element()

void *allocate_element(void *mempool) {
    struct element *new_elem;
    new_elem = get_free_element_from_mempool(mempool);
    kmemleak_alloc(new_elem->data, DATA_SIZE, 1, GFP_NOIO);
    return new_elem->data;
}

void free_element(void *mempool, void *element_to_remove) {
    struct element *elem;
    elem = container_of(element_to_remove, struct element, data);
    kmemleak_free(element_to_remove);
    return_element_to_mempool(mempool, elem);
}

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 2022-06-11
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2019-01-20
    • 2019-01-20
    相关资源
    最近更新 更多