2010-09-21 12 views

Répondre

8

Oui.

Vous pouvez énumérer les threads avec les fonctions Toolhelp; obtenir le contexte avec GetThreadContext(); et lire la mémoire de pile (c'est-à-dire en utilisant ESP à partir du contexte) avec ReadProcessMemory(). La pile se propage vers le bas en mémoire, ce qui permet de lire les emplacements mémoire après que l'ESP est descendu dans la pile.

+2

Et utilisez dbghelp api pour obtenir les noms des symboles pourrait être la prochaine étape. – Remko

1

Vous pouvez jeter un oeil à la procédure « TThreadSampler.MakeStackDump » de l'unité suivante de mon profileur d'échantillonnage: http://code.google.com/p/asmprofiler/source/browse/trunk/Sampling/mcThreadSampler.pas

Cette fonction peut lire à partir du même fil, ou même processus processus ou différents (chacun avec ses propre fonction optimisée). Btw: my Sampling Profiler lit les symboles de débogage Delphi (.map, .jdbg, etc) car il n'y a toujours pas de bon convertisseur de symboles de débogage Delphi vers Pdb (donc vous pouvez voir la pile d'un programme Delphi dans le débogueur Windows ou Processus Explorer, Visual Studio, etc). Vous pouvez également utiliser mon profileur d'échantillonnage pour voir la pile actuelle de n'importe quel processus! http://code.google.com/p/asmprofiler/wiki/AsmProfilerSamplingMode