35

我有一个错误(内存泄漏)软件。作为证据,我有 1GB 的 core.dump 文件。堆大小是 900MB,所以很明显,分配了一些东西,但没有释放内存。

所以,我有一个内存区域要像这样检查。

(gdb) x/50000s 0x200000000

但是,仅凭肉眼很难猜到,哪个对象或结构没有被释放。我的想法是,“将 gdb 格式的输出保存到文件中,并运行模式匹配以查看哪个魔术字符串出现最多。” 所以,这是我的问题:

如何将以下命令的输出保存到文本文件中,以便编写分析器?

(gdb) x/10000000s 0x20000000    <-- I need this output into a file
4

3 回答 3

58

您可以使用 gdb 的“转储”功能,参见:https ://sourceware.org/gdb/onlinedocs/gdb/Dump_002fRestore-Files.html

对于您的示例:

dump binary memory result.bin 0x200000000 0x20000c350

这将为您提供一个普通的二进制转储 int 文件result.bin。您还可以使用以下命令以十六进制格式转储它:

dump ihex memory result.bin 0x200000000 0x20000c350

使用转储命令比使用 gdb 日志记录 hack 更清晰(它甚至对我不起作用)。

于 2013-11-18T17:22:30.990 回答
16

如何将以下命令的输出保存到文本文件中,以便编写分析器?

 (gdb) x/10000000s 0x20000000

这实际上很容易:

(gdb) set height 0    # prevent GDB from stopping every screenfull
(gdb) set logging on  # GDB output is now also copied into gdb.txt
(gdb) x/10000000s 0x20000000
(gdb) quit

瞧,享受你的输出gdb.txt

我有一个错误(内存泄漏)软件。...“将 gdb 格式的输出保存到文件中,并运行模式匹配以查看出现最多的魔术字符串。”

这种想法不太可能产生令人满意的结果。考虑:

void some_function() {
   std::vector<string> *v = new std::vector<string>();
   // code to insert and use 1000s of strings into "v".
   return;  // Oops: forgot to delete "v".
}

即使您可以有效地“看到出现最多的魔术字符串”,您也会发现您正在泄漏所有字符串;但它们不是问题,泄漏“v”是问题。

所以你真正想要的是构建一个图,其中分配的区域指向其他分配的区域,并找到该图的“根”。这几乎是不可能手工完成的。

那么什么更有可能帮助您找到内存泄漏?幸运的是,有很多工具可以为您解决这个问题:

于 2013-04-19T05:20:28.087 回答
-3

你可以写简单的 lkm 就可以了

lkm:
#include <linux/kernel.h>
#include <linux/module.h>

int  *ptr=(int*)0Xc18251c0; //the address you want to read from kernel space
int module_i(void)
{
 printk("%d\n",*ptr);
}
module_init(module_i);

并且数据将显示在日志中,所以请写

enter code here
dmesg
于 2017-05-10T16:55:36.343 回答