Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se proporciona información útil para depurar subprocesos, incluida información sobre cómo establecer nombres de subprocesos para código nativo y administrado.
Sugerencias de C/C++
Estas son algunas sugerencias que puedes usar al depurar subprocesos en código nativo:
Para ver el contenido del bloque de información del subproceso, escriba
@TIBen la ventana Inspección o en el cuadro de diálogo Inspección rápida .Para ver el último código de error del subproceso actual, escriba
@Erren la ventana de Inspección o en el cuadro de diálogo Inspección rápida.Las funciones de bibliotecas de C Run-Time (CRT) pueden ser útiles para depurar una aplicación multiproceso. Para obtener más información, consulte _malloc_dbg.
Establecer un nombre de subproceso en C/C++
La asignación de nombres a subprocesos es posible en cualquier edición de Visual Studio. La nomenclatura de subprocesos es útil para identificar subprocesos de interés en la ventana Subprocesos al depurar un proceso en ejecución. Tener hilos con nombre reconocible también puede ser útil al realizar la depuración post-mortem mediante la inspección de volcados de memoria de fallos y al analizar capturas de rendimiento utilizando varias herramientas.
Formas de establecer un nombre de hilo
Hay dos maneras de asignar un nombre a un hilo. La primera es a través de la función SetThreadDescription . El segundo es lanzando una excepción particular mientras el depurador de Visual Studio está adjunto al proceso. Cada enfoque tiene ventajas y advertencias. El uso de SetThreadDescription se admite a partir de Windows 10 versión 1607 o Windows Server 2016.
Cabe destacar que ambos enfoques se pueden usar juntos, si lo desea, ya que los mecanismos por los que funcionan son independientes entre sí.
Establecer un nombre de subproceso mediante SetThreadDescription
Ventajas:
- Los nombres de subprocesos son visibles al depurar en Visual Studio, independientemente de si el depurador se adjuntó o no al proceso en el momento en que se invoca SetThreadDescription.
- Los nombres de subprocesos son visibles al realizar la depuración posterior al cargar un volcado de memoria en Visual Studio.
- Los nombres de subprocesos también son visibles cuando se usan otras herramientas, como el depurador de WinDbg y el analizador de rendimiento de Windows Performance Analyzer .
Advertencias:
- Los nombres de subprocesos solo son visibles en visual Studio 2017, versión 15.6 y versiones posteriores.
- Al analizar post mortem un archivo de volcado de memoria, los nombres de subprocesos solo son visibles si la falla se creó en Windows 10 versión 1607, Windows Server 2016 o versiones posteriores de Windows.
Example:
#include <windows.h>
#include <processthreadsapi.h>
int main()
{
HRESULT r;
r = SetThreadDescription(
GetCurrentThread(),
L"ThisIsMyThreadName!"
);
return 0;
}
Establecer un nombre de hilo lanzando una excepción
Otra manera de establecer un nombre de subproceso en el programa es comunicar el nombre del subproceso deseado al depurador de Visual Studio iniciando una excepción especialmente configurada.
Ventajas:
- Funciona en todas las versiones de Visual Studio.
Advertencias:
- Solo funciona si el depurador está asociado en el momento en que se usa el método basado en excepciones.
- Los nombres de subprocesos establecidos mediante este método no estarán disponibles en volcados de memoria ni en herramientas de análisis de rendimiento.
Example:
La SetThreadName función que se muestra a continuación muestra este enfoque basado en excepciones. Tenga en cuenta que el nombre del hilo se copiará automáticamente al hilo, de modo que la memoria del parámetro threadName se pueda liberar una vez que se complete la llamada SetThreadName.
//
// Usage: SetThreadName ((DWORD)-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, const char* threadName) {
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
#pragma warning(push)
#pragma warning(disable: 6320 6322)
__try{
RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info);
}
__except (EXCEPTION_EXECUTE_HANDLER){
}
#pragma warning(pop)
}
Establecer un nombre para el subproceso en código administrado
El nombrado de subprocesos es posible en cualquier edición de Visual Studio. La nomenclatura de subprocesos es útil para realizar un seguimiento de los subprocesos en la ventana Subprocesos .
Para establecer un nombre de subproceso en código administrado, use la Name propiedad .
Example
public class Needle
{
// This method will be called when the thread is started.
public void Baz()
{
Console.WriteLine("Needle Baz is running on another thread");
}
}
public void Main()
{
Console.WriteLine("Thread Simple Sample");
Needle oNeedle = new Needle();
// Create a Thread object.
System.Threading.Thread oThread = new System.Threading.Thread(oNeedle.Baz);
// Set the Thread name to "MyThread".
oThread.Name = "MyThread";
// Starting the thread invokes the ThreadStart delegate
oThread.Start();
}