我在我的应用程序中有一个间歇性崩溃的案例,我们使用了延迟加载DLL。有几个不同的调用栈,我们已经看到了崩溃,但它总是崩溃时,引发__delayLoadHelper2
在__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 gig内存),我不确定它是否对它有影响。但由于崩溃并不总是发生,它看起来像一个竞争条件,或资源问题。
This forum thread描述了我的情况,但没有解决方案。
知道为什么会这样吗?
2条答案
按热度按时间brgchamk1#
我的应用程序也有同样的崩溃,调用堆栈也完全一样。但是我的崩溃不同,因为一个本机DLL对另一个本机DLL有延迟加载依赖。
我永远不会延迟加载.NET程序集。.NET程序集应该使用托管程序集加载器函数来加载。它们也不应该通过对它们调用LoadLibrary来加载。
最后,我不确定是什么导致了崩溃,但我会完全删除.NET程序集的延迟加载。
4nkexdtk2#
当我试图在另一台没有Visual Studio C运行时调试版本的计算机上运行我的程序的调试版本时,我遇到了这个问题。(调试dll的命名通常稍有不同,在程序集名称的某个地方有一个额外的“D”)
我的程序的发行版配置工作得很好,因为我在它上面有可再发行的VS C运行时。
为了完整起见,我将给出这个问题的显而易见的答案,但我真诚地不想让它看起来居高临下...模块加载器找不到它所依赖的模块!我越是解决类似的问题,我就越告诉自己“相信错误消息”
Dependency步行者(dependency.exe)在这种情况下应该是您的朋友,尽管我不能肯定地说它如何处理延迟加载的模块。