2010-12-03 7 views
0

J'ai simplement débogué un processus (en C++/windows) qui utilise "GetThreadContext" qui est dans kernel32.dll.
je remarquai que je pouvais obtenir son adresse avecDébogueur VS2008 et kernel32.dll

unsigned long address = (unsigned long)(&GetThreadContext); 

mais quand je regardais l'onglet modules chargés - j'ai vu que les symboles kernel32.dll ne sont pas chargés!
Comment le VS2008 a-t-il connu l'adresse de "GetThreadContext"?
Et comment puis-je le faire moi-même sans avoir les PDB?
merci :)

+2

GetProcAddr (http://msdn.microsoft.com/en-gb/library/64tkc9y5%28v=VS.80%29.aspx) peut-être? Je ne l'ai jamais utilisé, donc je ne suis pas complètement sûr de ça. – BlackBear

+0

Ok, merci ... :) – Idov

+0

S'il vous plaît ne pas expédier PDB avec votre produit. –

Répondre

3

Cela fonctionne pour la même raison que

GetThreadContext(hThread, lpContext); 

œuvres. Les fonctions nommées utilisées dans votre code doivent être résolues au moment du lien, sinon le lien échouerait. Si vous prenez leur adresse en utilisant & ou en les appelant n'a pas d'importance. Lors de l'exécution, la DLL est chargée et le nom de la fonction est résolu en une adresse spécifique dans le processus.

Les fichiers PDB sont utilisés uniquement pour fournir des informations symboliques améliorées pendant le débogage. Normalement, ils ne sont pas utilisés lors de l'exécution.

[Je ne peux pas m'empêcher de penser qu'il me manque quelque chose à propos de cette question. Dites-moi si ce n'est pas votre problème.]

+0

Je pense que c'est déroutant le compilateur a besoin de savoir comment le débogueur résout les symboles. Bien que dans les deux cas, vous obtiendrez toujours la valeur correcte sans les symboles du fichier .dll. – MSN

Questions connexes