1

最近、一部の C++ コードを VS2005 -> VS2010 からアップグレードしました。

この C++ コードは RFA_RMDS と呼ばれ、Reuters RFA ライブラリの社内ラッパーです。このラッパーは、一部の C# コードで使用されます。したがって、明確にするために:

    C# -> C++ ラッパー (RFA_RMDS) -> Reuters RFA ライブラリ。 

アップグレード後、アプリケーションは RFA クライアントをインスタンス化するときに AccessViolationException (以下) をスローしますが、これは Windows 7 でのみです。つまり、Windows XP で正常に動作します。

さらに、C++ ラッパーの VS2005 バージョンを使用するアプリケーションの以前のビルドは、Windows 7 と Windows XP の両方で正常に動作します。

これにより、アップグレードがこの例外の原因であると私は信じています。しかし、私は C++ 開発者ではないので (そして、現在は開発者がいません)、これにどう対処すればよいか途方に暮れています。

さらにいくつかのポイント:

  • 実行可能ファイルがCorFlagsによって変更されているため、アプリケーションは Windows 7 で 32 ビット モードで実行されます。
  • 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
保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。

   std.basic_string,std::allocator >.{dtor}(basic_string\,std::allocator >* ) で
   c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\apploggerclient.cpp:line 70 の AppLoggerClient.processEvent(AppLoggerClient* , Event* event) で
   c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\messageloop.cpp:line 51 の CWM.WindowProc(HWND__* hwnd, UInt32 uMsg, UInt32 wParam, Int32 lParam)
   DispatchMessageW(tagMSG*) で
   c:\program files\microsoft sdks\windows\v6.0a\include\winuser.h:line 3052 の DispatchMessage(tagMSG* lpMsg) で
   c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\messageloop.cpp:line 89 の CWM.run(CWM* )
   c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\rfa_frame.cpp:line 122 の RFA_RMDS.RFA_Frame.Start()
   c:\buildagent\work\ef735b7d6bb58dc3\rfa_rmds\rfa_rmds\rfa_framemanager.cpp:line 126 の RFA_RMDS.RFA_FrameManager.WorkerThreadFunction()
   System.Threading.ThreadHelper.ThreadStart_Context (オブジェクトの状態) で
   System.Threading.ExecutionContext.runTryCode (オブジェクト userData) で
   System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode コード、CleanupCode backoutCode、オブジェクト userData) で
   System.Threading.ExecutionContext.RunInternal (ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態) で
   System.Threading.ExecutionContext.Run (ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態) で
   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:正確 /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 "_D​​EBUG" /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" 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\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\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_SlibessionLayer8 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.ライブラリ
4

5 に答える 5

2

アップグレード自体がエラーの原因ではなく、アップグレードによって明らかになったコードに欠陥または潜在的なバグがある可能性が高くなります。非決定論的または未定義の動作 (たとえば、初期化されていないポインターを逆参照したときに何が起こるかなど) は、ビルド間、実行環境間、またはコンパイラー間、さらにはリリースとデバッグ間、または直接実行時またはデバッガーを介した実行時にも変化する可能性が高くなります。 .

私はあなたが持っているデバッグ情報を使用することから始めます..\rfa_rmds\apploggerclient.cpp:line 70. これが明示的な場合、文字列オブジェクトが削除されdeleteます。ポインターは有効ですか? 文字列の配列を削除している場合、正しいdelete[]演算子が使用されていますか? 範囲外のオブジェクトである場合、auto他のエラー (バッファ オーバーランなど) によってオブジェクトが破損したことはありますか?

これらを確認する最も簡単な方法は、デバッガーでコードを実行することです。ただし、多くの場合、実行環境の変更により、非決定論的障害の動作が変更される可能性があるため、例外が発生しなくなった理由として、無効なポインターを介した書き込みやデータの破損など、他の誤った動作を観察できる場合があります。

于 2011-06-15T19:48:08.873 に答える
1

私も同じ問題を抱えていました。ネイティブプロジェクトの1つで、がの代わりにPlatform Toolsetに設定されていることが判明しました。v100v90

于 2012-09-27T12:02:48.220 に答える
1

rfa ログをデフォルトのアプリの起動場所 (Windows 7 ローミング) から c:\temp に移動します。

于 2011-12-09T06:00:24.810 に答える
0

エラーは DLL にあり、エラーは std::string デストラクタにあります。これは、DLL の外部で文字列を構築し、DLL の内部で破棄しようとしたことを示唆しています。DLL とアプリケーションには独自のメモリ マネージャーのコピーがあるため (DLL の境界を越えて動作するカスタム アロケーターを使用しない限り)、一方の割り当てと他方の割り当て解除はクラッシュを引き起こす可能性があります。これを回避する 1 つの方法は、どこでも RTL を動的にリンクして、メモリ マネージャーのコピーを 1 つだけにするか、カスタム アロケーターを作成して複数のメモリ マネージャーを回避することです (より多くの作業が必要になります)。

于 2011-06-15T22:18:43.243 に答える
0

ここでUACが問題ですか?場合によっては、RFA がレジストリまたはファイル システムにアクセスする必要があります。私はこれが問題になるかもしれないと推測しています。

于 2012-03-05T21:37:50.440 に答える