Jaq*_*enn 5 c++ memory-leaks visual-studio
我是一个大型商业程序的开发人员,我正在尝试追踪特定的 C++ 内存泄漏。我想使用 Visual Studio 搜索进程的整个有效地址空间,但我不知道如何有效地执行此搜索。
我知道此处的.s 命令文档,但它没有执行我需要的操作。例如,我 100% 确定地址 0xfdfd240 包含值 0x0f0e34a8。我可以成功使用 .s 命令在该地址附近进行搜索,如下所示:
.s -d 0x0fdfd200 L256000000 0x0f0e34a8
Found match at
0xfdfd240
Run Code Online (Sandbox Code Playgroud)
但是我的程序进行了许多小的分配,这给我留下了许多小的不连续的内存部分。如果我备份几千字节,搜索命令就会失败:
.s -d 0x0fd00000 L256000000 0x0f0e34a8
Memory location could not be read. Please specify a valid memory location.
Run Code Online (Sandbox Code Playgroud)
而且,当搜索命令发现第一个错误地址时,它似乎不再尝试向前搜索,即使在它之外还有有效地址。
.s -d 0x0f000000 L256000000 0x0f0e34a8
No match was found
Run Code Online (Sandbox Code Playgroud)
我隐约意识到有一种方法可以询问 Windows 对于给定进程哪些内存范围是有效的,因此我正在考虑编写一个小型一次性程序来收集该信息,然后自动将一系列搜索命令发送到立即窗口。 ..但似乎以前一定有人处理过这个问题,并且一定做了一些更聪明的事情。
另外,我可以提取正在运行的进程的转储文件,因此如果有人可以推荐第三方工具将转储提供给具有更强搜索功能的工具,那么也应该可以解决。
有什么建议么?
编辑:我在 VS2008SP1 和 VS2010SP1 中看到此行为。
在进行简单调试以外的任何操作时,我发现 WinDbg(Windows 调试工具的一部分)通常具有更好的功能。
您甚至不必从 WinDbg 进行所有调试。如果你在 VS 中做你的事情,然后想要搜索内存(或做其他在 VS 中不容易的事情),请转到 Debug -> Save Dump As... 确保选择“Minidump with Heap”文件类型。
这将为您的流程创建完整的快照文件。将其加载到 WinDbg 中,现在您可以使用许多很酷的命令。为了轻松访问文档,您始终可以在命令窗口中键入“.hh”。所有命令都列在调试器 -> 调试器参考 -> 调试器命令下。
你想要的是 s(搜索内存)
| 归档时间: |
|
| 查看次数: |
5808 次 |
| 最近记录: |