我有一个bug(内存泄漏)软件.作为证据,我有1GB的core.dump文件.堆大小是900MB,显然,分配的东西,但不释放内存.
所以,我有一个像这样检查的内存区域.
(gdb) x/50000s 0x200000000
Run Code Online (Sandbox Code Playgroud)
然而,这很难用肉眼猜测,哪个对象或结构没有被释放.我追踪的想法是,"将gdb格式化的输出保存到文件中,并运行模式匹配以查看哪个魔术字符串出现最多." 所以,这是我的问题:
如何将以下命令的输出保存到文本文件中,以便我可以编写分析器?
(gdb) x/10000000s 0x20000000 <-- I need this output into a file
Run Code Online (Sandbox Code Playgroud)
eci*_*eci 38
您可以使用gdb的"转储"功能,请参阅:https://sourceware.org/gdb/onlinedocs/gdb/Dump_002fRestore-Files.html
对于你的例子:
dump binary memory result.bin 0x200000000 0x20000c350
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个纯二进制转储int文件result.bin.您还可以使用以下内容以十六进制格式转储它:
dump ihex memory result.bin 0x200000000 0x20000c350
Run Code Online (Sandbox Code Playgroud)
使用dump命令比使用gdb日志记录hack(甚至不能以某种方式对我工作)更清晰.
Emp*_*ian 14
如何将以下命令的输出保存到文本文件中,以便我可以编写分析器?
Run Code Online (Sandbox Code Playgroud)(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
Run Code Online (Sandbox Code Playgroud)
瞧,享受你的输出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".
}
Run Code Online (Sandbox Code Playgroud)
即使你能够有效地"看到最多出现的魔法弦乐",你也会发现你正在泄漏所有的弦乐; 但他们不是问题,泄漏"v"是问题.
所以你真正想要的是建立一个图表,其中分配的区域指向其他分配的区域,并找到该图的"根".这几乎是不可能手工完成的.
那么什么更有可能帮助您找到内存泄漏?幸运的是,有很多工具可以解决这个问题:
| 归档时间: |
|
| 查看次数: |
41932 次 |
| 最近记录: |