有没有办法在加载 dll 时调试发布版本?

Posted

技术标签:

【中文标题】有没有办法在加载 dll 时调试发布版本?【英文标题】:Is there a way to debug a release version when loading dlls? 【发布时间】:2015-12-29 12:53:34 【问题描述】:

我正在使用 Visual Studio 2015、Qt 5.5 和 OpenCV3.0 开发一个 64 位 C++ 应用程序。该应用程序在我用于在 Release 和 Debug 版本中开发的 pc 上运行良好。但是相同的应用程序只能在其他 PC 上的 Debug 中运行,并且在发布版本中我收到以下错误消息:

 The application was unable to start correctly 0xc0000005, Click Ok toclose the application:

我创建了一个转储文件以使用 Visual Studio 调试器打开它,它显示在加载 opencv_imgproc300.dll 之前加载 dll 时应用程序停止。

我尝试查看事件查看器,但没有发现此错误。

有没有办法在启动时在加载dll时调试发布版本以了解问题的原因?

【问题讨论】:

最简单的第一步是在目标电脑上运行dependency walker并在其中打开你的exedependencywalker.com 您可以尝试使用 sysinternals-suite 中的 ProcessMonitor。不能保证,但它可能会显示一些有用的东西(它肯定会显示很多)。 我从 sysinternals 试过这个:technet.microsoft.com/en-us/sysinternals/bb963902.aspx。但它不显示丢失或损坏的 dll。对于dependencywalker,我使用Visual Studio Debugger中的Module窗口更好,它显示了所有加载的dll和加载的顺序,我觉得它更有帮助。 我会尝试在没有优化和调试信息 (pdb) 的情况下编译发布版本。这可以在客户端的计算机上提示您崩溃的位置... 我使用更好的模块窗口你确定吗? Dependency walker 有效地显示应该加载的 dll 并在找不到它们时标记它们,而模块窗口仅显示已加载的 dll (afaik) - 此外,dependency walker 是独立的,因此您可以在任何 PC 上使用它而无需安装,您可以t 用调试器来做(你需要安装 VS 或者远程调试工具) 【参考方案1】:

经过一番努力,我解决了这个问题,是因为opencv_imgproc300.dll损坏了,它有真实的大小但里面已经损坏了,我用dependency walker检查了,发现链接的DLL和里面的DLL有很大的不同应用程序文件夹和原始 dll 文件。 总而言之,如果你想在启动时调试一个发布版本,你有很多方法。我们将描述其中的两个:

    使用调试信息编译您的发布版本,并像在调试版本中一样运行您的应用程序。如果应用程序在加载 DLL 之前停止。此 DLL 可能已损坏或丢失。此链接显示如何使用调试信息编译发布版本:How to: Debug a Release Build。

    使用Dependency walker,你用这个工具打开你的发行版应用程序,你会发现它在启动时是否有任何损坏或丢失的dll(它在dependency walker中标记为红色)。如果您的应用程序是 64 位构建的,您应该使用 x64 版本的依赖步行器。如果是x86,应该使用x86版本的dependency walker。如果你使用 x86 版本打开你的应用程序的 x64 版本,你可以在他们的 x86 版本中看到一些与链接系统 DLL 相关的错误错误,但不要在意,这是 Dependency Walker 本身的一个错误。

【讨论】:

re 2:对于 x64 应用程序使用 x64 版本的依赖walker,对于 x86 使用 x86 版本

以上是关于有没有办法在加载 dll 时调试发布版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在开发时调试 nopCommerce 插件?

未显示错误时调试 GDB 中断

寻找如何在 VS 9 中调试到导出的 dll 函数。可能吗?

打印时调试断言错误

调试信息(断点等)存储在 VS2013、本机 C++ dll 项目中的位置在哪里?

C#:调试器中的 comctl32.dll 版本 6