8
votes

Comment obtenir des informations sur la pile de thread sur Windows?

Je énumère tous les threads dans un processus via la fonction CreateToolHelP32Snapshot . Je voudrais obtenir des informations de base de la pile pour chaque fil. Plus précisément, j'aimerais obtenir l'adresse du bas de la pile et si possible, j'aimerais obtenir l'adresse actuelle de la pile. Fondamentalement, il s'agit des informations affichées avec la commande ~ * k dans windbg. Alors, comment puis-je obtenir les informations de pile à partir de l'ID ou de la poignée du thread?


0 commentaires

5 Réponses :


0
votes

AS que je sais que je sais, ToolHelP fonctionne en effectuant une copie des informations de base sur des tas, des modules, des processus et des threads. Cela n'inclut pas le bloc TEB qui contient l'adresse du bas de la pile. Je pense que vous devez utiliser une autre API, l'API du moteur de débogueur, qui offre fonctionne pour examiner les piles


0 commentaires

9
votes

(les définitions peuvent être trouvées ici .)

Pour obtenir des limites de pile: < Pré> xxx

Pour obtenir la valeur de ESP , utilisez simplement getthreadcontext .


1 commentaires

Merci wj32! Je vais regarder le lien que vous avez fourni.



1
votes

Un moyen plus facile sans avoir à impliquer le kit de pilote Windows est aussi vrai:

NT_TIB* tib = (NT_TIB*)__readfsdword(0x18);
size_t* stackBottom = (size_t*)tib->StackLimit;
size_t* stackTop = (size_t*)tib->StackBase;


0 commentaires

1
votes

__ readfsdword () ne fonctionne que pour le fil actuel. Donc, la variante avec NTQuéryInformationthread () est plus flexible.

Ajout de certaines déclarations qui sont manquées dans ntdll.h: xxx


0 commentaires

0
votes

Voici un moyen facile pour le fil actuel (version portable Win32 x86 / x64): xxx

Remarque: StackLimit << Code> Stackbase (comme la pile grandit vers le bas).

Pour plus de détails, voir Win32 tib .


0 commentaires