std::string异常以及如何查找已编译的c++应用程序的平台工具集



我们有一个dll(由我们公司开发,我们有源代码),由另一个应用程序托管和加载(我们没有源代码)。最近,由于std字符串,我们出现了很多访问违规异常:

76FAE228:000196 [76FAE3BE] RtlInitializeGenericTable (ntdll.dll)
76FADFA5:00007E [76FAE023] RtlGetCompressionWorkSpaceSize (ntdll.dll)
749714C9:000014 [749714DD] HeapLock (kernel32.dll)
730B3B4E:0000CD [730B3C1B] free (msvcr90.dll)
736A5DFB:000035 [736A5E30] ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEX_NI@Z (msvcp90.dll) 
736A5EBB:000009 [736A5EC4] ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ (msvcp90.dll)

正如您所看到的,我们使用多线程DLL(/MD)作为运行库,并使用平台工具集v90…

我们怀疑托管应用程序将平台工具集更改为新版本,导致问题的原因是我找不到托管应用程序的平台工具集(他们使用多线程(/MT)作为运行库)Process Walker也没有帮助。。。

如果托管应用程序使用/MT,我如何找到它们的平台工具集?

谢谢。。。

多个解决方案(从最坏到更好的顺序):1) 如果dll带有头文件,请添加一个全局内联init函数如果定义了_MT和_DLL(请参见http://msdn.microsoft.com/en-us/library/vstudio/abx4dbyh.aspx)

2) 可以使用EnumProcessModules遍历程序中加载的dll(http://msdn.microsoft.com/en-us/library/ms682631%28VS.85%29.aspx)并检查msvcrtxxx.dll是否已加载。不过要小心,当你进行ccheck时,msvcrtxxx.dll可能还没有加载。

3) 将dll导出的方法设计为无crt例如,不要按值传递类(std::string)实例、crt对象(file..等);如果您提供了一种分配/销毁实例的方法,则指向类的指针是可以的;

最新更新