1

でアクセス違反が発生mfc90d.dllしてCObject:IsKindOfいます。これは、コールスタックの最も深い項目で、実際にはずっと前に実行さWinMainCRTStartupれているようです。これは、アプリケーションのモデルオブジェクトのいくつかの標準コンテナを作成したため、おそらく私のアプリにあります。 std::map<int, CDevice*>どこかで、次のテンプレート化されたコンテナC ++タイプが存在し、コールスタックに表示されます。

myapp.exe!std::_Tree<std::_Tmap_traits<int,CDevice   
         *,std::less<int>,std::allocator<std::pair<int const ,CDevice *> >,0> 
          >::_Copy(const std::_Tree<std::_Tmap_traits<int,CDevice 
         *,std::less<int>,std::allocator<std::pair<int const ,CDevice *> >,0> > &                     
         _Right={...})  Line 1067 + 0x1d bytes  C++

それが理由であると100%確信しているわけではありませんstd::map<int, CDevice*>が、私が見つけたのは「CDevice*」に関連する唯一のテンプレートリファレンスです。

わずかに簡略化されたコールスタック全体(省略記号...は、関数シグネチャの一部の詳細が省略されていることを示します)。

mfc90d.dll!CObject::IsKindOf(const CRuntimeClass * pClass=0x691a09ec)  
mfc90d.dll!CDocManager::OpenDocumentFile(const char * lpszFileName=0x007783e8)  
mfc90d.dll!CWinApp::OpenDocumentFile(const char * lpszFileName=0x007783e8)  
myapp.exe!CServerApp::InitInstance()  
mfc90d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * ...            
    myapp.exe!__tmainCRTStartup()  Line 574 + 0x35 bytes    C
myapp.exe!WinMainCRTStartup()  Line 399 C
kernel32.dll!762033aa()     
ntdll.dll!77369ef2()    
ntdll.dll!77369ec5()    
myapp.exe!std::_Tree<std::_Tmap_traits<int,CDevice ..........

質問:

  1. std::_Tree<...>::_Copyのようなものが、上の4つの呼び出しレイヤーレイヤー全体で非常に多くのレイヤーを実行する方法について少し不思議に思っていますmyapp.exe!WinMainCRTStartup。上記のコールスタックが正しくないことを疑う必要がありますか?

  2. std :: _ Tree <...>は、上記のような混乱とは何ですか?なぜそれが呼び出されるのCObject:IsKindOfですか?私のコードは次のようなSTLを使用しています std::map<int, CDevice*>
    私の推測では、へのすべての参照を削除するとstd::map<int, CDevice*>、上記のstd::_Tree内部実装コードはなくなります。

  3. これをはるか前WinMainCRTStartupに実行すると、このコードが実際にmfc90d.dllロード時に実行されることがわかります。それはおそらくそうですか?「このコードはいつ実行されているか」をより明確に把握するために、VC ++ 2008デバッガーでできることはありますか?

  4. アプリケーションの存続期間の早い段階で、いったいどのようにクラッシュが発生する可能性があるかを誰かに推測してもらうのは無理です。私はあなたがそのような問題をどのようにデバッグするかに興味があります、それでこれのどれかがあなたのために鐘を鳴らしたら、私はあなたの考えと考えに感謝します、しかし誰かに実際に何が起こっているのか推測するように頼むのは多すぎます。どういうわけか、それはランダムなヒープの破損だとだけ言っておきましょう。ただし、「dllでのMFCの使用からMFCの静的リンクへの切り替え」の順序に関するヒントがあれば、ぜひ聞いてみてください。

4

1 に答える 1

1

私の経験では、ntdll.DLLの下にあるものはすべて赤いニシンです。stdマップは、winmainを呼び出したntdllのコードを呼び出しませんでした。デバッガーはナンセンスを解釈し、それを理解しようとしています。一部のセミランダムバイナリデータには、関数の1つと一致するアドレスがありました。そこにいないふりをします。

于 2012-11-24T20:38:12.247 に答える