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 SymGetSymFromName64e 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 funzioneSymSetOptions con SYMOPT_UNDNAME oppure usare la funzioneUnDecorateSymbolName.
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 funzioneSymSetContextcon 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 nel 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 nell'ambito indicato da SymSetContext.
Per determinare se un simbolo è un parametro, controllare il Flags membro 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.