c ++ - SymFromAddr returnerer 'Det angivne modul kunne ikke findes.'

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at få symboler fra adresser, jeg kom fra min stak, men SymFromAddr holder fejl med systemfejl 126 (Det angivne modul kunne ikke findes.)

Jeg initialiserer den symbolske ting med


SymInitialize(m\_processHandle, NULL, TRUE);


(den sidste parameter == true ==> Den indlæser FBF automatisk)


og jeg bruger SymFromAddr som denne:


SYMBOL\_INFO\_PACKAGE sym = { sizeof(sym) };
sym.si.MaxNameLen = MAX\_SYM\_NAME; 
DWORD64 displacement = 0;
bool ok = SymFromAddr(m\_processHandle, address, &displacement, &sym.si);


Koden er i C ++ på Windows.
og FBF-FILEN ER I DIREKTØRET AF EXE!
Hvad gør jeg forkert?
tak :)

Bedste reference


SymFromAddr er lidt lækker.



  1. Hvis der forekommer LoadLibrary mellem SymInitialize og SymFromAddr, fungerer det muligvis ikke. Hvis SymFromAddr du kan perfom en SymInitialize igen (tip: du kan cache adresse for at undgå en masse af SymInitialize som er en stor CPU-forbruger)

  2. 64 bit implementering af SymFromAddr (dvs. SymFromAddr64) fungerer bedre

  3. Hvis kode ikke er optimeret, fungerer det bedre

  4. VC9 genereret pdb fungerer bedre end ældre version.



Du kan finde en ide i følgende kode
http://code.google.com/p/nprof/source/browse/0.11/Hook/StackWalker.cpp?r=281[3]