Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Dit artikel bevat nuttige informatie voor het opsporen van fouten in threads, waaronder informatie over het instellen van threadnamen voor systeemeigen en beheerde code.
C/C++ tips
Hier volgen enkele tips die u kunt gebruiken bij het opsporen van fouten in threads in systeemeigen code:
U kunt de inhoud van het threadinformatieblok bekijken door te typen
@TIBin het venster Controle of het dialoogvenster QuickWatch .U kunt de laatste foutcode voor de huidige thread bekijken door het dialoogvenster
@Errof QuickWatch in te voeren.C Run-Time Bibliotheken (CRT)-functies kunnen handig zijn voor het opsporen van fouten in een multithreadingtoepassing. Zie _malloc_dbg voor meer informatie.
Een threadnaam instellen in C/C++
Naamgeving van threads is mogelijk in elke versie van Visual Studio. Naamgeving van threads is handig voor het identificeren van interessante threads in het venster Threads bij het opsporen van fouten in een actief proces. Het herkennen van benoemde threads kan ook nuttig zijn bij het uitvoeren van post-mortem-foutopsporing via crashdumpinspectie en bij het analyseren van prestatieopnamen met behulp van verschillende hulpprogramma's.
Manieren om een threadnaam in te stellen
Er zijn twee manieren om een threadnaam in te stellen. De eerste is via de functie SetThreadDescription . De tweede is door een bepaalde uitzondering te genereren terwijl het Visual Studio-foutopsporingsprogramma is gekoppeld aan het proces. Elke benadering heeft voordelen en opmerkingen. Het gebruik van SetThreadDescription wordt ondersteund vanaf Windows 10 versie 1607 of Windows Server 2016.
Het is de moeite waard om te vermelden dat beide benaderingen, indien gewenst, samen kunnen worden gebruikt, omdat de mechanismen waarmee ze werken onafhankelijk van elkaar zijn.
Een threadnaam instellen met behulp van SetThreadDescription
Voordelen:
- Threadnamen zijn zichtbaar bij foutopsporing in Visual Studio, ongeacht of het foutopsporingsprogramma is gekoppeld aan het proces op het moment dat SetThreadDescription wordt aangeroepen.
- Threadnamen zijn zichtbaar bij het uitvoeren van post-mortem-foutopsporing door een crashdump in Visual Studio te laden.
- Threadnamen zijn ook zichtbaar wanneer u andere hulpprogramma's gebruikt, zoals het WinDbg-foutopsporingsprogramma en de Performance Analyzer-prestatieanalyse van Windows Performance Analyzer.
Waarschuwingen:
- Threadnamen zijn alleen zichtbaar in Visual Studio 2017 versie 15.6 en nieuwere versies.
- Bij het uitvoeren van post-mortem foutopsporing van een crashdumpbestand zijn threadnamen alleen zichtbaar als de crash is gemaakt op Windows 10 versie 1607, Windows Server 2016 of latere versies van Windows.
Example:
#include <windows.h>
#include <processthreadsapi.h>
int main()
{
HRESULT r;
r = SetThreadDescription(
GetCurrentThread(),
L"ThisIsMyThreadName!"
);
return 0;
}
Een threadnaam instellen door een uitzondering op te wekken
Een andere manier om een threadnaam in uw programma in te stellen, is door de gewenste threadnaam te communiceren met het foutopsporingsprogramma van Visual Studio door een speciaal geconfigureerde uitzondering te genereren.
Voordelen:
- Werkt in alle versies van Visual Studio.
Waarschuwingen:
- Werkt alleen als het foutopsporingsprogramma is gekoppeld op het moment dat de methode op basis van uitzonderingen wordt gebruikt.
- Threadnamen die zijn ingesteld met deze methode, zijn niet beschikbaar in hulpprogramma's voor dumps of prestatieanalyse.
Example:
De SetThreadName onderstaande functie laat deze benadering op basis van uitzonderingen zien. Houd er rekening mee dat de naam van de thread automatisch wordt gekopieerd naar de thread, zodat het geheugen voor de threadName parameter kan worden vrijgegeven nadat de SetThreadName aanroep is voltooid.
//
// 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)
}
Een threadnaam instellen in beheerde code
Naamgeving van threads is mogelijk in elke versie van Visual Studio. Naamgeving van threads is handig voor het bijhouden van threads in het venster Threads .
Gebruik de eigenschap Name om een threadnaam in beheerde code in te stellen.
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();
}