首页 文章

升级到VS2010的C项目,现在获得AccessViolationException

提问于
浏览
1

我们最近从VS2005升级了一些C代码 - > VS2010 .

这个C代码称为RFA_RMDS,它是路透社RFA库周围的内部包装器 . 这个包装器依次被一些C#代码使用 . 所以,要明确:

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

升级后,应用程序在实例化RFA客户端时抛出AccessViolationException(下面) - 但仅在Windows 7上 . 也就是说,它在Windows XP上运行正常 .

此外,使用VS2005版本的C包装器的应用程序的早期版本在Windows 7和Windows XP上都能正常工作 .

这让我相信升级是导致此异常的原因 . 然而, as I'm not a C++ developer (我们不知道如何解决这个问题 .

还有一些要点:

  • 应用程序在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)的可再发行组件 .

如果有任何我应该提供的信息,请告诉我 - 也许还有如何获得 .

任何提示/建议/解决方案,甚至最基本的东西都将非常感激 . 谢谢 .


Stack Trace

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++ Command Line

/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++ Command Line

/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 Linker Command Line

/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 Linker Command Line

/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

5 回答

  • 0

    这是一个猜测,基于两个因素:错误在DLL中,错误在std :: string析构函数中 . 这告诉我你有一个在DLL外部构造的字符串,并试图在DLL中销毁 . 由于DLL和应用程序拥有自己的内存管理器副本(除非您使用跨越DLL边界的自定义分配器),因此任何一个分配和另一个分配都可能导致崩溃 . 避免它的一种方法是在任何地方动态链接RTL,因此您只有一个内存管理器副本,或创建自定义分配器以避免多个内存管理器(更多的工作) .

  • 2

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

  • 0

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

    我将首先使用您拥有的调试信息,例如查看(及之前) ..\rfa_rmds\apploggerclient.cpp:line 70 时发生的情况 . 它导致删除一个字符串对象,如果这是一个显式 delete ,指针是否有效?如果删除字符串数组,是否使用了正确的 delete[] 运算符?如果它是一个超出范围的 auto 对象,是否有其他错误(例如缓冲区溢出)导致对象被破坏?

    验证这些内容的最简单方法是在调试器中执行代码 . 但是,执行环境的更改通常会改变非确定性错误的行为,因此为什么您可能不再获得异常,您仍然可以观察到其他错误行为,例如写入无效指针或数据损坏 .

  • 1

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

  • 1

    我有同样的问题 . 事实证明,在其中一个本机项目中, Platform Toolset 设置为 v100 而不是 v90 .

相关问题