gpt4 book ai didi

linux - Upstart init 正在泄漏内存,你如何调试它?

转载 作者:IT王子 更新时间:2023-10-29 00:44:03 24 4
gpt4 key购买 nike

我在 Upstart init 进程 (pid 1) 中有内存泄漏,我有哪些选项可以调试它?

编辑:为此建议我一些真正的工具,手动放置 printfs 或手动计算内存分配不会削减它。也转储 init 核心并四处寻找这不是一个真正的选择。

UPD1: valgrind 不工作。用适当的 valgrind + init 魔术替换内核命令行上的/sbin/init 似乎不是一个选项,因为它试图为 smap 访问/proc self ,但在运行 init 之前这些不可用。

UPD2: dmalloc 也不起作用(无法在 ARM 上编译)。

最佳答案

穷人的解决方案是只记录每次调用 mallocfree,然后梳理日志并寻找模式。

ld提供了一个可以在这里提供帮助的惊人功能。

--wrap=symbol

Use a wrapper function for symbol. Any undefined reference to symbol will be resolved to "__wrap_symbol". Any undefined reference to "__real_symbol" will be resolved to symbol.

This can be used to provide a wrapper for a system function. The wrapper function should be called "__wrap_symbol". If it wishes to call the system function, it should call "__real_symbol".

Here is a trivial example:

void *
__wrap_malloc (size_t c)
{
printf ("malloc called with %zu\n", c);
return __real_malloc (c);
}

If you link other code with this file using --wrap malloc, then all calls to "malloc" will call the function "__wrap_malloc" instead. The call to "__real_malloc" in "__wrap_malloc" will call the real "malloc" function.

You may wish to provide a "__real_malloc" function as well, so that links without the --wrap option will succeed. If you do this, you should not put the definition of "__real_malloc" in the same file as "__wrap_malloc"; if you do, the assembler may resolve the call before the linker has a chance to wrap it to "malloc".


更新

只是为了弄清楚这有什么用。

  • 将自定义文件添加到 Upstart 的构建中。

像这样:

void*__wrap_malloc( size_t c )
{
void *malloced = __real_malloc(c);
/* log malloced with its associated backtrace*/
/* something like: <malloced>: <bt-symbol-1>, <bt-symbol-2>, .. */
return malloced
}

void __wrap_free( void* addr )
{
/* log addr with its associated backtrace*/
/* something like: <addr>: <bt-symbol-1>, <bt-symbol-2>, .. */
__real_free(addr);
}
  • 使用调试符号 (-g) 重新编译 upstart,以便获得一些不错的回溯。如果您愿意,您仍然可以优化 (-O2/-O3) 代码。

  • 用额外的 LD_FLAGS 链接 Upstart --wrap=malloc, --wrap=free
    现在任何地方的 Upstart 调用 malloc 符号都会神奇地解析为你的新符号 __wrap_malloc。漂亮的是,这对编译后的代码来说是透明的,因为它发生在链接时。
    就像shimminginstrumenting没有任何困惑。

  • 像往常一样运行重新编译的 Upstart,直到您确定泄漏已经发生。

  • 查看日志以查找不匹配的 mallocedaddr

一些注意事项:

  • --wrap=symbol 特性不适用于实际上是宏的函数名。所以请注意 #define malloc nih_malloc。这就是您需要使用 --wrap=nih_malloc__wrap_nih_malloc 的 libnih。
  • 使用 gcc 的 builtin backtracing特征。
  • 所有这些更改只会影响重新编译的 Upstart 可执行文件。
  • 您可以将日志转储到 sqlite 数据库,这样可以更容易地找到不匹配的 malloc 和 frees。
  • 您可以让您的日志格式化为 SQL 插入语句,然后将它们插入数据库事后分析以供进一步分析。

关于linux - Upstart init 正在泄漏内存,你如何调试它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3887723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com