2011-06-15 64 views
1

最近,我们从VS2005升级一些C++代码 - > VS2010。升级C++项目VS2010,现在得到AccessViolationException

该C++代码被称为RFA_RMDS,它是围绕路透社RFA库的内部包装。这个包装器被一些C#代码依次使用。因此,要明确:

 C# -> C++ Wrapper (RFA_RMDS) -> Reuters RFA libraries. 

升级之后,应用程序引发AccessViolationException实例化一个RFA客户端时(下) - 但只有在Windows 7上。也就是说,它工作正常的Windows XP。

而且,使用了C++包装的VS2005版本的应用程序的早期版本工作正常的Windows 7和Windows XP。

这使我相信,升级是此异常的原因。然而,因为我不是C++开发人员(而且我们现在还没有一个),所以我不知道如何解决这个问题。

一些进一步的点:

  • 在Windows 7 32位模式中的应用程序运行作为可执行已由CorFlags修改。
  • 使用VS2005的C++包装的应用程序的早期版本的Windows 7和Win XP都工作正常。
  • 的C++包装目标.NET 2.0,虽然它用于靶向.NET 3.5(其中C#代码目标)。即使目标是.NET 3.5,也存在这个问题。
  • Windows 7包含Microsoft Visual C++ 2005(x86 ??/x64),2008(x86/x64)和2010(x86)的可再发行组件。

请让我知道,如果有任何我应提供更多的信息 - 也许还如何得到它。

任何提示/建议/解决方案,即使是最基本的东西,将非常感激。谢谢。


堆栈跟踪

 

AccessViolationException 
Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 

    at std.basic_string,std::allocator >.{dtor}(basic_string\,std::allocator >*) 
    at AppLoggerClient.processEvent(AppLoggerClient* , Event* event) in c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\apploggerclient.cpp:line 70 
    at CWM.WindowProc(HWND__* hwnd, UInt32 uMsg, UInt32 wParam, Int32 lParam) in c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\messageloop.cpp:line 51 
    at DispatchMessageW(tagMSG*) 
    at DispatchMessage(tagMSG* lpMsg) in c:\program files\microsoft sdks\windows\v6.0a\include\winuser.h:line 3052 
    at CWM.run(CWM*) in c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\messageloop.cpp:line 89 
    at RFA_RMDS.RFA_Frame.Start() in c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\rfa_frame.cpp:line 122 
    at RFA_RMDS.RFA_FrameManager.WorkerThreadFunction() in c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\rfa_framemanager.cpp:line 126 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

VS2010 C++命令行

 
/I"..\..\RFA-6.3\Include" /I"..\..\RFA-6.3\Include\TIBMsg" /I"..\..\RFA- 6.3\Include\SessionLayer" /I"..\..\RFA-6.3\Include\Common" /I"..\..\RFA-6.3\Include\Logger" /I"..\..\RFA-6.3\Include\Config" /Zi /clr:oldSyntax /nologo /W3 /WX- /O2 /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /EHa /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Yu"StdAfx.h" /Fp"Release\RFA_RMDS.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc90.pdb" /Gd /TP /FU"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll" /FU"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll" /FU"c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll" /analyze- /errorReport:queue 

VS2005 C++命令行

 
/Od /I "..\..\RFA-6.3\Include" /I "..\..\RFA-6.3\Include\TIBMsg" /I "..\..\RFA-6.3\Include\SessionLayer" /I "..\..\RFA-6.3\Include\Common" /I "..\..\RFA-6.3\Include\Logger" /I "..\..\RFA-6.3\Include\Config" /D "WIN32" /D "_DEBUG" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /FD /EHa /MDd /Yu"stdafx.h" /Fp"Debug\RFA_RMDS.pch" /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Zi /clr:oldSyntax /TP /errorReport:prompt /FU "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll" /FU "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll" /FU "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.XML.dll" 

VS2010链接器命令行

 
/OUT:"F:\checkout\gl\global\trunk\client\modules\RFASource\DotNet2.0\RFA_RMDS\Release\RFA_RMDS.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"..\..\RFA-6.3\Libs" /DLL "msvcprt.lib" "msvcrt.lib" "ws2_32.lib" "RFA6_Common80.lib" "RFA6_Config80.lib" "RFA6_Logger80.lib" "RFA6_Data80.lib" "RFA6_Connections80.lib" "RFA6_Connections_MD80.lib" "RFA6_SessionLayer80.lib" "AnsiPage80.lib" "libTibMsg.lib" "dacslock.lib" "Shell32.lib" "Shlwapi.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Release\RFA_RMDS.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"F:\checkout\gl\global\trunk\client\modules\RFASource\DotNet2.0\RFA_RMDS\Release\RFA_RMDS.pdb" /PGD:"F:\checkout\gl\global\trunk\client\modules\RFASource\DotNet2.0\RFA_RMDS\Release\RFA_RMDS.pgd" /LTCG /TLBID:1 /DYNAMICBASE:NO /FIXED:NO /MACHINE:X86 /ERRORREPORT:QUEUE 

VS2005链接器命令行

 
/OUT:"F:\checkout\gl\global\trunk\client\modules\RFASource_VS2005\DotNet2.0\RFA_RMDS\Debug\RFA_RMDS.dll" /INCREMENTAL /NOLOGO /LIBPATH:"..\..\RFA-6.3\Libs" /DLL /MANIFEST /MANIFESTFILE:"Debug\RFA_RMDS.dll.intermediate.manifest" /DEBUG /ASSEMBLYDEBUG /PDB:"f:\checkout\gl\global\trunk\client\modules\RFASource_VS2005\DotNet2.0\RFA_RMDS\Debug\RFA_RMDS.pdb" /MACHINE:X86 /FIXED:No /ERRORREPORT:PROMPT msvcprt.lib msvcrt.lib ws2_32.lib RFA6_Common80.lib RFA6_Config80.lib RFA6_Logger80.lib RFA6_Data80.lib RFA6_Connections80.lib RFA6_Connections_MD80.lib RFA6_SessionLayer80.lib AnsiPage80.lib libTibMsg.lib dacslock.lib Shell32.lib Shlwapi.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 
+0

看起来像一个'std :: string'从它的析构函数中抛出一个异常,这是不对的。你是否重新编译了所有的依赖代码(即第三方库等)? – rubenvb 2011-06-15 19:05:40

+0

您有堆损坏可能是由于不一致或不兼容的连接。重建所有库和项目,并确保在目标机器上部署正确的VC运行时(如果需要),可以从Microsoft下载VC redist。 – AJG85 2011-06-15 19:14:53

+0

@rubenvb:唯一的依赖代码是Microsoft.VisualC 8.0.0.0和mscorlib/System/System.Data/System.Xml - 全部为2.0.0.0。 – 2011-06-15 19:21:27

回答

2

它更可能是存在已暴露在升级,而不是导致错误的升级本身的代码中的缺陷或潜在缺陷。非确定性或未定义的行为(例如,当您取消引用未初始化的指针时发生的情况)很容易在构建,执行环境或编译器之间,甚至在发行版和调试之间或者直接运行或通过调试器运行。

我会用你的调试信息,如采取看看什么是在(之前)..\rfa_rmds\apploggerclient.cpp:line 70发生开始。它导致一个字符串对象被删除,如果这是一个明确的delete,指针是否有效?如果它正在删除一串字符串,那么是否使用了正确的delete[]运算符?如果它是一个auto对象超出范围,有其他错误(例如缓冲区溢出)导致对象被损坏?

来验证这些事情最简单的方法是在调试器中执行代码。然而,执行环境的变化通常会改变非确定性故障的行为,所以为什么不再有异常,您仍然可以观察到其他错误行为,例如通过无效指针写入或数据损坏。

0

这是一个猜测,基于两个因素:该错误是在DLL,并且错误是的std :: string析构函数。这表明你有一个在DLL之外构建的字符串,并试图在DLL内被销毁。由于DLL和应用程序拥有自己的内存管理器副本(除非使用自定义分配器跨DLL边界工作),因此任何分配和另一个分配都会导致崩溃。避免这种情况的一种方法是在任何地方动态链接RTL,这样你只有一个内存管理器副本,或者创建一个自定义分配器来避免多个内存管理器(更多的工作)。

1

将rfa日志从默认的应用程序启动位置(Windows 7漫游)移至即c:\ temp。

+0

我想我的RFA经验表明,这是一个很好的开始 - – Tim 2012-03-05 21:36:49

0

是UAC这里的问题?有时RFA需要访问注册表或文件系统。我猜这可能是一个问题。

1

我有同样的问题。原来,在其中一个本地项目中,Platform Toolset设置为v100而不是v90