En este pequeño artículo nos gustaría hablar sobre uno de los aspectos más problemáticos a la hora de la programación multihilo sobre Win32 como es la depuración de este tipo de aplicaciones, y sobre la que no existe demasiada información.

Más allá de .NET sigue existiendo vida, aunque cada vez menos, y para la depuración de este tipo de aplicaciones es muy importante llevar un registro del hilo activo y el propósito del mismo. Para ello el depurador utiliza un pseudo-registro llamado TIB con la información del hilo en ejecución.

Pero que es el Thread Information Block ?

Es una estructura (si, en sentido literal en lenguaje C) denominada NT_TIB que almacena la información sobre el hilo en ejecución.

typedef struct _NT_TIB
{
    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
    PVOID StackBase;
    PVOID StackLimit;
    PVOID SubSystemTib;
    union
   {
        PVOID FiberData;
        DWORD Version;
   };
    PVOID ArbitraryUserPointer;
    struct _NT_TIB *Self;
} NT_TIB;

Esta estructura, también conocida como Thread Environment Block (TEB) nos permite obtener información sobre un proceso sin necesidad de invocar la API Win32. Es más, funciones de dicha API como GetCurrentProcessId(), GetCurrentThreadId() acceden a dicha estructura para la obtención sus valores.

Usando el TIB para depuración

Partiendo de la documentación de Matt Pietrek sobre esto, para la obtención de la dirección del TIB del proceso activo utilizaremos la siguiente función:

static void *getTib()
{
    void *pTib;>
    __asm {
         mov EAX, FS:[0x18]
         mov [pTib], EAX
    }
return pTib;
}

Con esto y estableciendo un identificador para cada hilo, a través de la función SetThreadName() podremos establecer un puntero al campo pvArbitrary que nos mostrará la información del hilo en ejecución actual sin necesidad de acceder a la sección de Threads en el debugger para verificar en qué hilo de ejecución nos encontramos.