Tipy pro ladění vláken
Tento článek obsahuje užitečné informace pro ladění vláken, včetně informací o nastavení názvů vláken pro nativní a spravovaný kód.
Tipy pro C/C++
Tady je několik tipů, které můžete použít při ladění vláken v nativním kódu:
Obsah bloku informací o vlákně můžete zobrazit zadáním
@TIB
do okna kukátka nebo dialogového okna QuickWatch .Poslední kód chyby pro aktuální vlákno můžete zobrazit zadáním
@Err
do okna kukátka nebo dialogového okna QuickWatch .Funkce C Run-Time Libraries (CRT) můžou být užitečné pro ladění vícevláknové aplikace. Další informace najdete v tématu _malloc_dbg.
Nastavení názvu vlákna v C/C++
Pojmenování vláken je možné v libovolné edici sady Visual Studio. Pojmenování vláken je užitečné při identifikaci vláken, která vás zajímají, v okně Vlákna při ladění spuštěného procesu. Rozpoznávání pojmenovaných vláken může být užitečné také při provádění ladění po havárii prostřednictvím kontroly výpisu stavu systému a při analýze zachytávání výkonu pomocí různých nástrojů.
Způsoby nastavení názvu vlákna
Název vlákna můžete nastavit dvěma způsoby. První je prostřednictvím funkce SetThreadDescription . Druhým je vyvolání konkrétní výjimky, zatímco ladicí program sady Visual Studio je připojen k procesu. Každý přístup má výhody a upozornění. Použití SetThreadDescription
se podporuje od verze 1607 nebo Windows Serveru 2016 ve Windows 10.
Je třeba poznamenat, že oba přístupy lze v případě potřeby používat společně, protože mechanismy, podle kterých pracují, jsou nezávislé na sobě.
Nastavení názvu vlákna pomocí SetThreadDescription
Výhody:
- Názvy vláken jsou viditelné při ladění v sadě Visual Studio bez ohledu na to, zda byl ladicí program připojen k procesu v době vyvolání setThreadDescription.
- Názvy vláken jsou viditelné při provádění ladění po mortemu načtením výpisu stavu systému v sadě Visual Studio.
- Názvy vláken jsou viditelné také při použití jiných nástrojů, jako je ladicí program WinDbg a analyzátor výkonu systému Windows Analyzátor výkonu.
Upozornění:
- Názvy vláken jsou viditelné pouze v sadě Visual Studio 2017 verze 15.6 a novějších verzích.
- Při následném ladění souboru s výpisem stavu systému se názvy vláken zobrazí jenom v případě, že se chyba vytvořila ve Windows 10 verze 1607, Windows Serveru 2016 nebo novějších verzích Windows.
Příklad:
#include <windows.h>
#include <processthreadsapi.h>
int main()
{
HRESULT r;
r = SetThreadDescription(
GetCurrentThread(),
L"ThisIsMyThreadName!"
);
return 0;
}
Nastavení názvu vlákna vyvoláním výjimky
Dalším způsobem, jak nastavit název vlákna v programu, je sdělit požadovaný název vlákna ladicímu programu sady Visual Studio vyvoláním speciálně nakonfigurované výjimky.
Výhody:
- Funguje ve všech verzích sady Visual Studio.
Upozornění:
- Funguje pouze v případě, že je ladicí program připojen v době použití metody založené na výjimce.
- Názvy vláken nastavené pomocí této metody nebudou k dispozici v nástrojích pro výpisy paměti ani analýzu výkonu.
Příklad:
Následující SetThreadName
funkce ukazuje tento přístup založený na výjimce. Všimněte si, že název vlákna se automaticky zkopíruje do vlákna, aby bylo možné uvolnit paměť parametru threadName
SetThreadName
po dokončení volání.
//
// 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)
}
Nastavení názvu vlákna ve spravovaném kódu
Pojmenování vláken je možné v libovolné edici sady Visual Studio. Pojmenování vláken je užitečné pro sledování vláken v okně Vlákna .
Pokud chcete nastavit název vlákna ve spravovaném kódu, použijte Name tuto vlastnost.
Příklad
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();
}