2009-05-25 15 views
15

¿Cómo puedo establecer un nombre para un hilo de Win32. No encontré ninguna API de Win32 para lograr lo mismo. Básicamente, quiero agregar el nombre del hilo en el archivo de registro. ¿Es TLS (Thread Local Storage) la única forma de hacerlo?¿Cómo establecer el nombre de un hilo de Win32?

+0

El SetThreadDescription() de la API es , en adelante, la API por la cual Microsoft apoyará esto. Para obtener más detalles, consulte esta respuesta: http://stackoverflow.com/a/43787005/434413 –

Respuesta

1

Siempre puede almacenar esta información en una estructura de datos adecuada. Use un hash o un mapa para asignar GetThreadId() a este nombre. Como GetThreadId() siempre es un identificador único, funciona bien.

¡Salud!

Por supuesto, si está creando muchos hilos, que HashMap llenará lentamente y utilizar más y más memoria, por lo algún procedimiento de limpieza es probablemente una buena cosa también.

Tienes toda la razón. Cuando un hilo muere, su entrada correspondiente en el mapa debe eliminarse naturalmente.

+0

Por supuesto, si está creando muchos subprocesos, ese hashmap se llenará lentamente y usará más y más memoria, por lo que algunos procedimientos de limpieza también son algo bueno. –

+0

downvoting porque también necesito una respuesta a esta pregunta, pero en realidad necesito establecer un nombre para el hilo por razones de perfil. Su respuesta no responde la pregunta: P –

29

¿Le sirve de ayuda? How to: Set a Thread Name in Native Code

En el código administrado, es tan fácil como establecer la propiedad Nombre del objeto Thread correspondiente.

+1

Supongo que es solo para que el depurador de Visual Studio muestre el nombre del subproceso. – Canopus

+1

Otros depuradores han seguido y responden a la misma señal –

+3

Como http://thetweaker.wordpress.com/2009/04/10/naming-threads/ notes, todos lo hacen almacenando el nombre del subproceso en una estructura de datos del depurador . Ergo, sin un depurador, el nombre no se almacenaría y no estaría disponible para fines de registro. Error desagradable, también: cuando intenta depurarlo, de repente funciona de nuevo. – MSalters

1

Si desea ver el nombre de su hilo en el depurador (windbg o Visual Studio): http://blogs.msdn.com/stevejs/archive/2005/12/19/505815.aspx

realidad no estoy seguro si hay un método inverso para obtener el nombre del hilo. Pero TLS parece ser el camino a seguir.

+0

Tiene una impresión equivocada. El nombre del hilo ** no ** está almacenado con el hilo. Se almacena únicamente en el depurador y, en consecuencia, solo existe cuando se conecta un depurador. Sin un depurador, la excepción simplemente se ejecuta en el siguiente filtro de excepción, que continúa como si nunca hubiera pasado nada. El nombre del subproceso se pierde cuando la aplicación no se ejecuta bajo un depurador. – IInspectable

17

http://msdn.microsoft.com/en-us/library/xcb2z8hs(VS.90).aspx

// 
// Usage: SetThreadName (-1, "MainThread"); 
// 
#include <windows.h> 
const DWORD MS_VC_EXCEPTION=0x406D1388; 

#pragma pack(push,8) 
typedef struct tagTHREADNAME_INFO 
{ 
    DWORD dwType; // Must be 0x1000. 
    LPCSTR szName; // Pointer to name (in user addr space). 
    DWORD dwThreadID; // Thread ID (-1=caller thread). 
    DWORD dwFlags; // Reserved for future use, must be zero. 
} THREADNAME_INFO; 
#pragma pack(pop) 

void SetThreadName(DWORD dwThreadID, char* threadName) 
{ 
    THREADNAME_INFO info; 
    info.dwType = 0x1000; 
    info.szName = threadName; 
    info.dwThreadID = dwThreadID; 
    info.dwFlags = 0; 

    __try 
    { 
     RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR),  (ULONG_PTR*)&info); 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) 
    { 
    } 
} 
+0

Esto no funcionará, a menos que ejecute el código en un depurador. Ciertamente no se puede usar para registrar el nombre de un hilo en un sistema en vivo. – IInspectable

9

hilos Win32 no tienen nombres. Existe una convención de Microsoft según la cual las aplicaciones presentan excepciones especiales de SEH que contienen un nombre de subproceso. Estas excepciones pueden ser interceptadas por los depuradores y utilizadas para indicar el nombre de la secuencia. Un par de respuestas cubre eso.

Sin embargo, eso es manejado por el depurador. Los hilos en sí mismos son objetos sin nombre. Entonces, si quiere asociar nombres con sus hilos, tendrá que desarrollar su propio mecanismo. Aunque podría usar el almacenamiento local de subprocesos que solo le permitirá obtener el nombre del código que se ejecuta en ese subproceso. Por lo tanto, un mapa global entre la ID del hilo y el nombre parecería el enfoque más natural y útil.

1

Otra forma de hacerlo es almacenar un puntero al nombre en el campo ArbitraryUserPointer del TEB del subproceso. Esto se puede escribir y leer en tiempo de ejecución.

Hay un artículo de CodeProject titulado "Debugging With The Thread Information Block" que le muestra cómo hacerlo.

3

Puede usar un objeto de almacenamiento local de subprocesos para almacenar el nombre. Por ejemplo,

__declspec(thread) char threadName[32]; 

entonces usted puede escribir y leer esto de un hilo. Esto podría ser útil en una aplicación de registro, donde desea imprimir el nombre del hilo para cada mensaje. Probablemente desee escribir esta variable tan pronto como se inicie el hilo, y también lanzar la excepción de Microsoft (https://stackoverflow.com/a/10364541/364818) para que el depurador también conozca el nombre de la secuencia.

2

De acuerdo con la discusión con los cables del equipo de depuración de Microsoft (consulte el enlace a continuación para obtener más detalles) la API SetThreadDescription es la API que utilizará Microsoft en adelante para admitir el nombre de subproceso oficialmente en código nativo. Por "oficialmente" me refiero a una API soportada por MS para nombrar subprocesos, a diferencia del truco de lanzamiento de excepción actual que actualmente solo funciona mientras se está ejecutando un proceso en Visual Studio.

Esta API se hizo disponible a partir de Windows 10, versión 1607.

Actualmente, sin embargo, hay muy poco apoyo de herramientas, por lo que los nombres que ha establecido no serán visibles en el depuradores WINDBG Visual Studio o. A partir de abril de 2017, sin embargo, las herramientas Microsoft xperf/WPA sí lo admiten (los hilos nombrados a través de esta API tendrán sus nombres aparecerán correctamente en esas herramientas).

Si desea ver esta ganancia mejor soporte, como por ejemplo en WinDbg, Visual Studio y archivos de volcado de sucesos, puedes votar por ella usando este enlace:

https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/17608120-properly-support-native-thread-naming-via-the-sett

+0

Actualización: Windows Performance Analyzer y una nueva versión de WinDbg ahora admiten mostrar los nombres de subprocesos establecidos a través de SetThreadDescriptionAPI. https://blogs.msdn.microsoft.com/windbg/2017/06/29/debugger-updates-in-the-16225-sdk-preview/ –

Cuestiones relacionadas