Dela via


Tips för felsökning av trådar

Den här artikeln innehåller användbar information för felsökning av trådar, inklusive information om hur du anger trådnamn för intern och hanterad kod.

C/C++-tips

Här följer några tips som du kan använda när du felsöker trådar i inbyggd kod:

  • Du kan visa innehållet i trådinformationsblocket genom att @TIB skriva i bevakningsfönstret eller i dialogrutan QuickWatch .

  • Du kan visa den senaste felkoden för den aktuella tråden genom att ange @Err i fönstret Watch eller QuickWatch .

  • C Run-Time-biblioteksfunktioner (CRT) kan vara användbara för felsökning av en flertrådad applikation. Mer information finns i _malloc_dbg.

Ange ett trådnamn i C/C++

Trådnamngivning är möjligt i alla utgåvor av Visual Studio. Trådnamngivning är användbart för att identifiera trådar av intresse i fönstret Trådar när du felsöker en process som körs. Att ha igenkännbart namngivna trådar kan också vara till hjälp när du utför post-mortem-felsökning genom granskning av kraschdumps och när du analyserar prestandaövervakning med hjälp av olika verktyg.

Sätt att ange ett trådnamn

Det finns två sätt att ange ett trådnamn. Den första är via funktionen SetThreadDescription . Det andra är genom att utlösa ett visst undantag medan Visual Studio-felsökningsprogrammet är kopplat till processen. Varje metod har fördelar och varningar. Användning av SetThreadDescription stöds från och med Windows 10 version 1607 eller Windows Server 2016.

Det är värt att notera att båda metoderna kan användas tillsammans, om så önskas, eftersom de mekanismer som de arbetar med är oberoende av varandra.

Ange ett trådnamn med hjälp av SetThreadDescription

Fördelar:

  • Trådnamn visas vid felsökning i Visual Studio, oavsett om felsökningsprogrammet var kopplat till processen vid den tidpunkt då SetThreadDescription anropas.
  • Trådnamn visas vid post-mortem-felsökning genom att ladda en kraschdump i Visual Studio.
  • Trådnamn visas också när du använder andra verktyg, till exempel WinDbg-felsökningsprogrammet och prestandaanalysverktyget för Windows Performance Analyzer .

Varningar:

  • Trådnamn visas endast i Visual Studio 2017 version 15.6 och senare versioner.
  • När du utför post-mortem felsökning av en kraschdumpfil visas trådnamn endast om kraschen skapades i Windows 10 version 1607, Windows Server 2016 eller senare versioner av Windows.

Example:

#include <windows.h>
#include <processthreadsapi.h>

int main()
{
    HRESULT r;
    r = SetThreadDescription(
        GetCurrentThread(),
        L"ThisIsMyThreadName!"
    );

    return 0;
}

Ange ett trådnamn genom att utlösa ett undantag

Ett annat sätt att ange ett trådnamn i programmet är att kommunicera önskat trådnamn till Visual Studio-felsökningsprogrammet genom att utlösa ett särskilt konfigurerat undantag.

Fördelar:

  • Fungerar i alla versioner av Visual Studio.

Varningar:

  • Fungerar bara om felsökningsprogrammet är kopplat när den undantagsbaserade metoden används.
  • Trådnamn som anges med den här metoden kommer inte att vara tillgängliga i dumpar eller prestandaanalysverktyg.

Example:

Funktionen SetThreadName som visas nedan visar den här undantagsbaserade metoden. Observera att trådnamnet automatiskt kopieras till tråden, så att minnet för parametern threadName kan släppas när anropet SetThreadName har slutförts.

//
// 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)
}

Ange ett trådnamn i hanterad kod

Trådnamngivning är möjligt i alla utgåvor av Visual Studio. Trådnamngivning är användbart för att hålla reda på trådar i fönstret Trådar .

Om du vill ange ett trådnamn i hanterad kod använder du egenskapen Name .

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