【发布时间】: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 的内容,以便将来可以调试此类问题。如果你的程序有缺陷,它很可能会再次发生。
-
线程共享内存,也许不是堆栈,但至少是堆。否则,您将无法在生产者线程和消费者线程之间交换数据。