Модернизированный проект C ++ до VS2010, теперь получите AccessViolationException - PullRequest
1 голос
/ 15 июня 2011

Недавно мы обновили код C ++ из VS2005 -> VS2010.

Этот код C ++ называется RFA_RMDS и является внутренней оболочкой для библиотек Reuters RFA. Эта оболочка по очереди используется некоторым кодом C #. Итак, чтобы быть ясным:

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

После обновления приложение создает исключение AccessViolationException (ниже) при создании экземпляра клиента RFA - но только в Windows 7. То есть в Windows XP работает нормально.

Кроме того, более ранняя сборка приложения, использующая версию оболочки C ++ для VS2005, прекрасно работает как в Windows 7, так и в Windows XP.

Это приводит меня к мысли, что причиной этого исключения является обновление. Тем не менее, , поскольку я не являюсь разработчиком C ++ (а у нас его сейчас нет), я не знаю, как решить эту проблему.

Некоторые дополнительные пункты:

  • Приложение работает в 32-разрядном режиме в Windows 7, поскольку исполняемый файл был изменен с помощью 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

Ответы [ 5 ]

2 голосов
/ 15 июня 2011

Скорее всего, в коде, обнаруженном обновлением, есть ошибка или скрытая ошибка, а не само обновление, вызвавшее ошибку. Недетерминированное или неопределенное поведение (например, то, что происходит при разыменовании неинициализированного указателя, например), может легко измениться между сборками, или средой выполнения, или компилятором, и даже между выпуском и отладкой или при запуске напрямую или через отладчик. .

Я бы начал с использования имеющейся у вас информации отладки, например, взглянул на то, что происходит в (и до) ..\rfa_rmds\apploggerclient.cpp:line 70. Это вызывает удаление строкового объекта, если это явный delete, допустим ли указатель? Если он удаляет массив строк, был ли использован правильный оператор delete[]? Если это auto объект, выходящий из области видимости, была ли какая-либо другая ошибка (например, переполнение буфера) причиной повреждения объекта?

Самый простой способ проверить это - выполнить код в отладчике. Однако часто изменение среды выполнения может изменить поведение недетерминированных ошибок, поэтому, почему вы больше не можете получить исключение, вы все равно можете наблюдать другое ошибочное поведение, такое как запись через недопустимый указатель или повреждение данных.

1 голос
/ 27 сентября 2012

У меня была такая же проблема.Оказалось, что в одном из нативных проектов Platform Toolset было установлено на v100 вместо v90.

1 голос
/ 09 декабря 2011

Переместить журнал rfa в i.e c: \ temp из места запуска приложения по умолчанию (роуминг Windows 7).

0 голосов
/ 06 марта 2012

UAC проблема здесь?Иногда RFA требуется доступ к реестру или файловой системе.Я предполагаю, что это может быть проблемой.

0 голосов
/ 16 июня 2011

Это предположение, основанное на двух факторах: ошибка в DLL, а ошибка в деструкторе std :: string. Это говорит мне о том, что у вас есть строка, созданная за пределами DLL и попытка быть уничтоженной внутри DLL. Поскольку DLL и приложение имеют свои собственные копии диспетчера памяти (если вы не используете настраиваемые распределители, работающие через границы DLL), любое выделение в одном и освобождение в другом, вероятно, приведет к сбою. Один из способов избежать этого - динамически связывать RTL везде, чтобы у вас была только одна копия диспетчера памяти, или создайте пользовательский распределитель, чтобы избежать нескольких диспетчеров памяти (намного больше работы).

...