2010-11-20 10 views
1

Je suis en train d'obtenir des symboles à partir d'adresses que j'ai reçu de ma pile, mais SymFromAddr échoue après avec une erreur de système 126 (Le module spécifié est introuvable.)
Je suis initialiser la chose symboling avecSymFromAddr renvoie «Le module spécifié est introuvable.

SymInitialize(m_processHandle, NULL, TRUE); 

(le dernier paramètre == true ==> Il charge l'APB automatiquement)

et je l'utilise SymFromAddr comme ceci:

SYMBOL_INFO_PACKAGE sym = { sizeof(sym) }; 
sym.si.MaxNameLen = MAX_SYM_NAME; 
DWORD64 displacement = 0; 
bool ok = SymFromAddr(m_processHandle, address, &displacement, &sym.si); 

le code est en C++ sur windows. et le fichier PDB est dans le répertoire de l'EXE! Qu'est-ce que je fais de mal? merci :)

+0

Il devrait être sizeof (SYMBOL_INFO) au lieu de sizeof (sym); Je ne sais pas si cela cause l'erreur, cependant. Vous pouvez utiliser le moniteur de processus pour voir s'il regarde dans l'endroit prévu ou pas. – Luke

+0

quoi? Comment puis-je utiliser Process Monitor pour cela? :) – Idov

+0

Vous pouvez vérifier s'il charge le fichier .pdb à partir de l'emplacement correct. – Luke

Répondre

0

SymFromAddr est un peu capricieux.

  1. Si une bibliothèque LoadLibrary se produit entre SymInitialize et SymFromAddr, cela peut ne pas fonctionner. Si SymFromAddr vous pouvez perfom un SymInitialize nouveau (indice: vous pouvez mettre en cache l'adresse pour éviter beaucoup de SymInitialize qui est un énorme CONSOMMATEUR CPU)
  2. 64 bits de mise en œuvre de SymFromAddr (.-À-dire SymFromAddr64) fonctionne mieux
  3. Si le code n'est pas optimisé ça va mieux fonctionner
  4. VC9 généré pdb fonctionne mieux que l'ancienne version.

Vous pouvez trouver une idée dans le code suivant http://code.google.com/p/nprof/source/browse/0.11/Hook/StackWalker.cpp?r=281

Questions connexes