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 回答