2013-05-07 8 views
5

Ich habe einen Absturz-Dump, den ich analysieren möchte (VC++ 2010).Welche std :: map-Methoden sind unabhängig von Template-Parametern identisch (und können Symbole gemeinsam nutzen)?

Ich habe dann eine Aufrufliste, die so aussieht (ich habe hier viel zur besseren Lesbarkeit getrimmt):

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() ruft _Erase())

Beachten Sie den Unterschied in der Template-Parameter des Wertes (StructA vs. StructB). Nun, ich weiß, dass verschiedene Methoden, die genau die gleiche binäre haben können das gleiche Symbol in der PDB, obwohl sie tatsächlich anderen Code verwenden. Ich nehme an, das ist hier der Fall (std :: map :: _ Erase ist gleich, unabhängig vom Werttyp).

Aber wie kann ich das wissen? Gibt es eine Liste von STL-Methoden (für diese MS-Implementierung), für die dies gilt? Ist es möglich, dass es sich um einen Fehler handelt?

Update:

in den PDB Blick (in einem Texteditor), sehe ich viele std :: map < ...> :: _ Erase und speziell für sie beide STRUCTA und StructB ich sehe. Ich weiß nicht, ob das etwas mit der Faltung zu tun hat.

Darüber hinaus zeigt der disassemblierte Code von std :: map einen Aufruf an eine Adresse, die als std :: map interpretiert wird. Ich denke, dass diese mittlere Code-Faltung ...

+0

Vielleicht, wenn Sie Ihre exe/dll mit Abhängigkeit Walker öffnen werden Sie alle _Erase Symbole finden und sehen, ob es tatsächlich zwei sind. Ich habe nie versucht, es selbst zu überprüfen, daher kann ich aus Erfahrung nicht sagen, ob dies in diesem Fall hilfreich ist. – selalerer

Antwort

0

Nun, landete ich mit dem Erstellen einer Map-Datei Wiederaufbau nach oben. In der Map-Datei kann ich sehen, dass beide Methoden (_Erase für StructA und _Erase für StructB) die gleiche Adresse haben. Also ist es kein Fehler.

1

Sie können /OPT:NOICF verwenden, um das Code-Faltungsverhalten zu deaktivieren.

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

+0

Danke. Gibt es einen Weg, es post mortem zu tun? Oder zumindest den Compiler zum Drucken bringen, welche Funktionen zusammen gefaltet/übersprungen werden? – Asaf

+0

@Asaf: Die vertrauenswürdigste Version ist die äußere, da sie wahrscheinlich Code hat, der vom realen Typ abhängt. Auf jeden Fall finden Sie das erste Symbol, das nicht in der Standardbibliothek ist, die hoffentlich nicht zu viele verschiedene Kartentypen verwendet. –

Verwandte Themen