【问题标题】:windows dump file (hdmp) - information without pdb filesWindows 转储文件 (hdmp) - 没有 pdb 文件的信息
【发布时间】:2017-12-22 02:28:06
【问题描述】:

由于内存泄漏(在另一台计算机上)导致我们的软件崩溃,我收到了转储文件(.mdmp 和 .hdmp)。 该软件由一个 exe 文件和多个 .dll 文件组成。 我确实有源代码(部分 c++,部分 delphi),但我没有用于该确切构建的 .pdb 文件。

我可以在 Visual Studio 或 WinDbg 中打开 mdmp/hdmp。但是我没有获得很多信息,因为我没有 .pdb 文件。 由于 hdmp 文件大约 4gb 大,我希望我已经有很多信息,即使没有 pdb 文件。 但是我没有得到真正有用的堆栈跟踪或其他信息,例如当我使用命令时

!analyze -v

是否有可能获得更好的结果?我能否以某种方式找出每个 dll 使用多少内存(或者更确切地说是连接到特定 dll 的进程)? 由于我有源代码,我可以使用新生成的 pdb 文件(用于 c++ 模块)吗?即使它们不是 100% 准确的。知道是哪个模块导致了内存泄漏已经很有帮助了!

【问题讨论】:

  • “进程”?一个转储仅用于一个进程。此外,内存是按进程分配的,而不是按 DLL 分配的。
  • 假设您构建了 PDB,您如何确定它们的准确率是 99% 还是只有 1%?你使用了哪个编译器版本,哪个环境,哪个源?更改其中任何一个都可能会改变结果。
  • 即使您可以找到从 Delphi 源代码创建 PDB 的工具(并且没有这样的工具可以很好地工作),那么您也不太可能重新创建可执行文件的确切版本。您需要做的是在您的软件中添加类似 madExcept 的内容,以便将来可以调试此类问题。如果你的程序有缺陷,它很可能会再次发生。
  • 线程共享内存,也许不是堆栈,但至少是堆。否则,您将无法在生产者线程和消费者线程之间交换数据。

标签: c++ delphi windbg pdb


【解决方案1】:

您可以在没有完全匹配版本的情况下加载 pdb 文件。为此,您必须使用命令 .symopt +40 加载任何内容 SYMOPT_LOAD_ANYTHING

0:000> .symopt
Symbol options are 0x30237:
  0x00000001 - SYMOPT_CASE_INSENSITIVE
  0x00000002 - SYMOPT_UNDNAME
  0x00000004 - SYMOPT_DEFERRED_LOADS
  0x00000010 - SYMOPT_LOAD_LINES
  0x00000020 - SYMOPT_OMAP_FIND_NEAREST
  0x00000200 - SYMOPT_FAIL_CRITICAL_ERRORS
  0x00010000 - SYMOPT_AUTO_PUBLICS
  0x00020000 - SYMOPT_NO_IMAGE_SEARCH

现在你必须运行另一个命令!sym noisy。这将启用嘈杂模式

0:000> !sym noisy
noisy mode - symbol prompts on

完成此操作后,您可以运行分析命令,您将开始获取所有符号加载消息以及 windbg 查找符号的位置。

确保将 pdb 文件路径添加到 windbg 使用 .sympath 查找的符号路径

0:000> .sympath 
Symbol search path is: srv*c:\symcache*http://msdl.microsoft.com/download/symbols
Expanded Symbol search path is: srv*c:\symcache*http://msdl.microsoft.com/download/symbols

请注意,有时即使我们添加了 sympath,一些符号文件也会在某些文件夹中查找。在这种情况下,我所做的是将 pdb 文件复制到 windbg 正在查找的文件夹中。

例如

DBGHELP:ntdll - 公共符号
c:\symcache\wntdll.pdb\B5ACAC3B4A6C4515AF416D60366399652\wntdll.pdb

我只是将 pdb 文件复制到 c:\symcache\wntdll.pdb\B5ACAC3B4A6C4515AF416D60366399652。

说了这么多

没有泄漏跟踪就很难分析原生 C++ 内存泄漏 转储。

请尝试使用DebugDiag native memory leak analysis,它应该会告诉您什么堆占用了内存。如果是一些自定义库堆,您可以尝试更新此特定组件。以下文章可能会对您有所帮助

debugging-native-memory-leaks-with-debug-diag-1-1

walkthrough-troubleshooting-a-native-memory-leak

using-debugdiags-leaktrack-with-procdumps-reflected-process-dumps

【讨论】:

    猜你喜欢
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多