2013-05-07 12 views
5

Ho un crash dump che sto cercando di analizzare (VC++ 2010).Quali metodi std :: map sono identici (e potrebbero condividere simboli) indipendentemente dai parametri del modello?

Ho poi ho uno stack che assomiglia a questo (ho rifilato un sacco qui per migliorare la leggibilità):

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

nota la differenza nel parametro template del valore (StructA vs. StructB). Ora, so che diversi metodi che hanno esattamente lo stesso binario possono avere lo stesso simbolo nel PDB anche se in realtà usano un codice diverso. Presumo che questo sia il caso qui (std :: map :: _ Erase è lo stesso indipendentemente dal tipo di valore).

Ma come posso sapere? Esiste una lista di metodi stl (per questa implementazione MS) per i quali questo si applica? E 'possibile che sia una specie di bug?

Aggiornamento:

Guardando al PPB (in un editor di testo), vedo molti std :: map < ...> :: _ Erase, e in particolare li vedo sia per StructA e StructB. Non so se significhi qualcosa sul piegamento.

Inoltre, il codice disassemblato di std :: map mostra una chiamata a un indirizzo che è interpretato come std :: map. Immagino che questo codice medio si pieghi ...

+0

Forse se aprirai il tuo exe/dll con dependency walker puoi trovare tutti i simboli _Erase e vedere se ce ne sono in realtà due. Non ho mai provato a controllarlo da solo, quindi non posso dire per esperienza se questo sarà utile in questo caso. – selalerer

risposta

0

Beh, ho finito per ricostruire con la creazione di un file di mappa. Nel file di mappa posso vedere che entrambi i metodi (_Erase for StructA e _Erase for StructB) hanno lo stesso indirizzo. Quindi non è un bug.

1

È possibile utilizzare /OPT:NOICF per disabilitare il comportamento di piegatura del codice.

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

+0

Grazie. C'è un modo per farlo postmortem? O almeno ottenere il compilatore per stampare quali funzioni è piegato insieme/saltato piegare insieme? – Asaf

+0

@Asaf: la versione più affidabile è quella esterna, poiché è quella che probabilmente ha il codice in base al tipo reale. Ad ogni modo, trova il primo simbolo che non si trova all'interno della libreria standard, che si spera non usi troppi tipi di mappe differenti. –