转储内存,将格式化的输出保存到文件中

时间:2013-04-19 01:48:13

标签: memory-leaks gdb

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

所以,我有一个像这样检查的记忆区域。

(gdb) x/50000s 0x200000000

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

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

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

3 个答案:

答案 0 :(得分:30)

您可以使用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

使用dump命令比使用gdb日志记录黑客更清楚(甚至不能以某种方式对我起作用)。

答案 1 :(得分:12)

  

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

 (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

Voila,在gdb.txt中享受你的输出。

  

我有一个bug(内存泄漏)软件。 ...“将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”就是问题。

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

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

答案 2 :(得分:0)

你可以写简单的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