Simboli pubblici, globali e locali

Le funzionalità di gestione dei simboli dell'API DbgHelp si sono sviluppate nel corso degli anni. Per garantire che il codice funzioni in un'ampia gamma di scenari e fornisca dettagli completi sui simboli, usare le funzioni più recenti quando possibile. Ad esempio, SymEnumSymbols sostituisce SymEnumerateSymbols64, SymFromName sostituisce SymGetSymFromName64 e SymFromAddr sostituisce SymGetSymFromAddr64.

Simboli pubblici

Le versioni iniziali di DbgHelp.dll supportano l'analisi solo dei simboli pubblici. Questi simboli vengono generati per qualsiasi elemento nel codice che deve essere esposto tra file di origine diversi. Includono anche tutti gli elementi esportati dal modulo.

I simboli sono incorporati nell'immagine o archiviati separatamente in un file con estensione dbg o pdb. Le uniche informazioni archiviate sono il nome e l'indirizzo del simbolo. I nomi sono disponibili come nomi decorati. Per visualizzare i nomi nondecorati, chiamare la funzione SymSetOptions con SYMOPT_UNDNAME oppure usare la funzione UnDecorateSymbolName.

Si noti che l'API DbgHelp non è stata inizialmente progettata per supportare più istanze dello stesso simbolo all'interno di un modulo. Ciò è dovuto al fatto che i simboli pubblici sono limitati a nomi univoci all'interno di un modulo. Pertanto, SymGetSymFromName64 restituisce solo il primo simbolo corrispondente. Per recuperare tutti i simboli corrispondenti, chiamare SymEnumSymbols.

Simboli globali e locali

Le versioni più recenti di DbgHelp.dll supportano i simboli globali e locali quando si usano file con estensione pdb. Queste nuove versioni includono funzioni statiche, funzioni con ambito all'interno di un file di origine, parametri di funzione e variabili locali. Quando DbgHelp cerca un simbolo, controlla le tabelle dei simboli globali e locali prima di controllare la tabella dei simboli pubblici. Ciò è dovuto al fatto che sono disponibili più informazioni per questi tipi di simboli rispetto a quelli disponibili per i simboli pubblici.

I simboli globali e locali vengono archiviati con nomi non calcolati. Pertanto, il flag SYMOPT_UNDNAME non ha alcun effetto. Per ottenere nomi di simboli decorati, è necessario usare il flag SYMOPT_PUBLICS_ONLY. In questo modo DbgHelp esegue la ricerca solo nei simboli pubblici.

Per visualizzare i simboli locali o i parametri di funzione, chiamare la funzione SymSetContext con il membro InstructionOffset della struttura IMAGEHLP_STACK_FRAME impostata sull'indirizzo di qualsiasi simbolo di funzione. Le chiamate successive a SymFromName e SymEnumSymbols possono operare all'interno del contesto di questo indirizzo. A tale scopo, impostare il parametro BaseOfDll su NULL e omettere l'identificatore di modulo dal parametro Name o Mask . In questo modo DbgHelp cerca i simboli corrispondenti all'interno dell'ambito indicato da SymSetContext.

Per determinare se un simbolo è un parametro, controllare il membro Flags della struttura SYMBOL_INFO . Se il simbolo è un parametro, il membro contiene SYMFLAG_PARAMETER. Se si tratta di un simbolo locale, il membro contiene SYMFLAG_LOCAL.