Enumero todos los hilos en un proceso a través de la función CreateToolhelp32Snapshot
. Me gustaría obtener información de pila básica para cada hilo. Más específicamente, me gustaría obtener la dirección del fondo de la pila y, si es posible, me gustaría obtener la dirección actual de la pila. Básicamente esta es la información que se muestra con el comando ~*k
en WinDbg. Entonces, ¿cómo puedo obtener la información de la pila desde la ID del hilo o HANDLE?¿Cómo obtener la información de la pila de subprocesos en Windows?
7
A
Respuesta
8
(Las definiciones pueden encontrarse here.)
para obtener los límites de pila:
THREAD_BASIC_INFORMATION basicInfo;
NT_TIB tib;
// Get TEB address
NtQueryInformationThread(YOUR_THREAD_HANDLE, ThreadBasicInformation, &basicInfo, sizeof(THREAD_BASIC_INFORMATION), NULL);
// Read TIB
NtReadVirtualMemory(YOUR_PROCESS_HANDLE, basicInfo.TebBaseAddress, &tib, sizeof(NT_TIB), NULL);
// Check tib.StackBase and tib.StackLimit
para obtener el valor de esp
, simplemente use GetThreadContext
.
0
Según lo que sé, Toolhelp funciona al hacer una copia de la información básica sobre montones, módulos, procesos y subprocesos. Esto no incluye el bloque TEB que contiene la dirección inferior de la pila. Creo que es necesario utilizar otro API, la API del motor depurador, que ofrece functions to examine the stacks
1
Una forma más fácil sin tener que involucrar el Kit de controladores de Windows es tan así:
NT_TIB* tib = (NT_TIB*)__readfsdword(0x18);
size_t* stackBottom = (size_t*)tib->StackLimit;
size_t* stackTop = (size_t*)tib->StackBase;
1
__readfsdword() sólo funciona para el subproceso actual. Entonces, la variante con NtQueryInformationThread() es más flexible.
añadido algunas declaraciones que no son detectados en ntdll.h:
typedef enum _THREADINFOCLASS {
ThreadBasicInformation = 0,
} THREADINFOCLASS;
typedef LONG KPRIORITY;
typedef struct _CLIENT_ID {
HANDLE UniqueProcess;
HANDLE UniqueThread;
} CLIENT_ID;
typedef CLIENT_ID *PCLIENT_ID;
typedef struct _THREAD_BASIC_INFORMATION
{
NTSTATUS ExitStatus;
PVOID TebBaseAddress;
CLIENT_ID ClientId;
KAFFINITY AffinityMask;
KPRIORITY Priority;
KPRIORITY BasePriority;
} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
Cuestiones relacionadas
- 1. tamaño de pila de subprocesos en Windows (Visual C++)
- 2. La pila .NET vs pila de Windows
- 3. Cambiar la prioridad de subprocesos de subprocesos en Windows
- 4. ¿Cómo obtengo la información de la batería en Windows?
- 5. Cómo obtener la pila completa de StackOverflowError
- 6. Imprimir la información de seguimiento de la pila de C#
- 7. Recopilación de información sobre la programación de subprocesos en Linux
- 8. Cómo obtener información de la cámara web
- 9. ¿Cómo puedo obtener la información de la CPU en .net?
- 10. ¿Cómo obtener información de hardware en Windows usando C++?
- 11. Cómo obtener un seguimiento de pila en todos los subprocesos de ruby en pasajero
- 12. Cómo obtener la dirección del puntero de la pila base
- 13. volcado de la pila de Java en Windows
- 14. ¿Cómo puedo obtener la pila de llamadas en Clojure?
- 15. obtener toda la información de procesos en ejecución usando QProcess
- 16. SecCertificateRef: ¿cómo obtener la información del certificado?
- 17. Obtener información de la memoria con Qt
- 18. ¿Cómo recuperas la información de presión de la aguja en Windows?
- 19. cómo obtener información de la tienda en Magento?
- 20. cómo obtener la información de conexión wifi actual en android
- 21. ¿Cómo obtener información de la impresora en .NET?
- 22. Cómo obtener información de la ruta actual en OnActionExecuting
- 23. programación C# obtener Seguimiento de la pila
- 24. subprocesos lógicos actuales aumentando/la pila de subprocesos se está filtrando
- 25. Cómo obtener la pila de pila nativa de las excepciones nativas capturadas en el código administrado
- 26. Cómo obtener el seguimiento de la pila de un hilo
- 27. Cómo obtener información de la unidad por volumen id
- 28. ¿Cómo obtener la pila de llamadas completa de Valgrind?
- 29. ¿Cómo obtener información de la consola de JavaScript de Chrome?
- 30. ¿Cómo obtener la versión de la aplicación en Windows Phone?
, gracias wj32! Echaré un vistazo al enlace que proporcionaste. – user473750