5

我在使用延迟加载 DLL 的应用程序中遇到了间歇性崩溃的情况。有几个不同的调用堆栈我们已经看到了崩溃,但它总是在引发时0xC06D007E: Module not found崩溃__delayLoadHelper2

连续多次(连续)调用进程时会引发异常。这是一个示例调用堆栈:

KERNELBASE.dll!RaiseException()  + 0x3d bytes   
MYDLL.dll!__delayLoadHelper2(const ImgDelayDescr * pidd=0x000000000012f650, __int64 (void)* * ppfnIATEntry=0x000000000012f570)  Line 331    C++
MYDLL.dll!__tailMerge_MyDelayLoadDLL_dll()  + 0x3f bytes    Unknown
MYDLL.dll!MyUserFunction()  Line 91 + 0x5 bytes C++

c++ 应用程序正在使用延迟加载 DLL 加载 .NET 代码。

发生崩溃的计算机是非常强大的机器(12 核 CPU,48 g ram),我不确定它是否对其有影响。但由于崩溃并非一直发生,它看起来像是一个竞争条件或资源问题。

这个论坛帖子描述了我的情况,但没有解决方案。

知道为什么会发生这种情况吗?

4

2 回答 2

0

我的应用程序也发生了同样的崩溃,调用堆栈也完全相同。然而,我的崩溃是不同的,因为本机 DLL 对另一个本机 DLL 具有延迟加载依赖性。

我永远不会延迟加载 .NET 程序集。.NET 程序集应该使用托管程序集加载器函数加载。它们也不应该通过调用 LoadLibrary 来加载。

最后,我不确定是什么导致了崩溃,但我会完全消除 .NET 程序集的延迟加载。

于 2012-05-31T12:43:36.940 回答
0

当我尝试在另一台没有 Visual Studio C++ 运行时调试版本的机器上运行我的程序的调试版本时,我遇到了这个问题。(调试 dll 的命名通常略有不同,在程序集名称中的某处有一个额外的“D”)

我的程序的发布配置运行良好,因为我有可再发行的 VS C++ 运行时。

为了完整起见,我将对这个问题给出明显的答案,但我真诚地并不是说它看起来居高临下......模块加载器找不到它所依赖的模块!我越是解决这样的问题,我就越会告诉自己“相信错误信息”

在这种情况下,Dependency Walker (depends.exe) 应该是您的朋友,尽管我不能自信地说它如何处理延迟加载的模块。

于 2017-05-04T20:30:13.830 回答