У меня есть аварийный дамп, который я пытаюсь проанализировать (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<…> :: _ Стереть, и конкретно я их вижу как для StructA, так и для StructB. Я не знаю, означает ли это что-нибудь о складывании.
Кроме того, дизассемблированный код std :: map показывает вызов по адресу, который интерпретируется как std :: map.
Я думаю, это означает сворачивание кода …
Ты можешь использовать /OPT:NOICF
отключить поведение свертывания кода.
http://msdn.microsoft.com/en-us/library/bxwfs976%28v=vs.80%29.aspx
Ну, я закончил восстановление с созданием файла карты.
В файле карты я вижу, что оба метода (_Erase для StructA и _Erase для StructB) имеют одинаковый адрес.
Так что это не ошибка.