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();
}