5

分析しようとしているクラッシュ ダンプがあります (VC++ 2010)。

次に、次のようなコールスタックがあります (読みやすくするために、ここでは多くの部分を削除しました)。

myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructB,std::less<unsigned int> ... >::_Erase(...)
myapp.exe!std::_Tree<std::_Tmap_traits<unsigned int,StructA,std::less<unsigned int>,... >::clear() 

(clear() は _Erase() を呼び出します)

値のテンプレート パラメーターの違いに注意してください (StructA と StructB)。これで、まったく同じバイナリを持つさまざまなメソッドが、実際には異なるコードを使用していても、PDB で同じシンボルを持つことができることがわかりました。ここではこれが当てはまると思います(値の型に関係なく std::map::_Erase は同じです)。

しかし、どうすれば知ることができますか?これが適用される stl メソッド (この MS 実装用) のリストはありますか? ある種のバグである可能性はありますか?

アップデート:

(テキスト エディターで) PDB を調べると、多くの std::map<...>::_Erase が表示されます。具体的には、StructA と StructB の両方で表示されます。折り畳みに意味があるかどうかはわかりません。

さらに、std::map の逆アセンブルされたコードは、std::map として解釈されるアドレスへの呼び出しを示しています。これはコードの折りたたみを意味すると思います...

4

2 に答える 2

1

/OPT:NOICFコードの折りたたみ動作を無効にするために使用できます。

http://msdn.microsoft.com/en-us/library/bxwfs976%28v=vs.80%29.aspx

于 2013-05-07T19:38:40.850 に答える
0

さて、マップファイルを作成して再構築することになりました。マップ ファイルでは、両方のメソッド (StructA の _Erase と StructB の _Erase) のアドレスが同じであることがわかります。したがって、これはバグではありません。

于 2013-05-08T08:58:55.993 に答える