Megosztás:


Tippek a hibás szálak elhárításához

Ez a cikk hasznos információkat nyújt a szálak hibakereséséhez, beleértve a natív és felügyelt kód szálneveinek beállításával kapcsolatos információkat.

C/C++ tippek

Az alábbi tippeket használhatja a natív kódban található szálak hibakereséséhez:

  • A Szálinformációs blokk tartalmát a @TIB ablakban vagy a Gyorsóra párbeszédpanelen beírva tekintheti meg.

  • Az aktuális szál utolsó hibakódját a @Err ablak vagy a Gyorsóra párbeszédpanel beírásával tekintheti meg.

  • A C Run-Time Kódtárak (CRT) függvények hasznosak lehetnek többszálú alkalmazások hibakereséséhez. További információ: _malloc_dbg.

Szálnév beállítása c/C++ nyelven

A szál elnevezése a Visual Studio bármely kiadásában lehetséges. A szálelnevezés hasznos lehet a Szálak ablak érdekes szálainak azonosításához egy futó folyamat hibakeresésekor. A felismerhetően elnevezett szálak hasznosak lehetnek a posztmortem hibakeresésben hibajegyzetek vizsgálatakor, valamint a teljesítményadatok különféle eszközökkel történő elemzésénél.

Szálnév beállításának módjai

A szálnév kétféleképpen állítható be. Az első a SetThreadDescription függvényen keresztül történik. A második az, hogy egy adott kivételt ad meg, miközben a Visual Studio hibakeresője hozzá van kapcsolva a folyamathoz. Minden megközelítésnek vannak előnyei és kikötései. A használat SetThreadDescription a Windows 10 1607-es vagy Windows Server 2016-os verziójától kezdve támogatott.

Érdemes megjegyezni, hogy mindkét megközelítés használható együtt, ha szükséges, mivel azok a mechanizmusok, amelyekkel működnek, függetlenek egymástól.

A szál nevét állítsa be a(z) SetThreadDescription használatával.

Előnyök:

  • A szálnevek a Visual Studióban végzett hibakereséskor láthatók, függetlenül attól, hogy a hibakereső a SetThreadDescription meghívásának időpontjában kapcsolódott-e a folyamathoz.
  • A szálnevek a post mortem hibakeresés során egy összeomlási memóriakép Visual Studióban való betöltésekor láthatók.
  • A szálnevek más eszközök, például a WinDbg hibakereső és a Windows Teljesítményelemző teljesítményelemzője használatakor is láthatók.

Figyelmeztetések

  • A szálnevek csak a Visual Studio 2017 15.6-os és újabb verzióiban láthatók.
  • Az összeomlás utáni memóriaképfájl hibakeresésekor a szálnevek csak akkor láthatók, ha az összeomlás a Windows 10 1607-es, Windows Server 2016-os vagy újabb verzióiban jött létre.

Example:

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

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

    return 0;
}

Szálnév beállítása kivétel kivetésével

Egy másik módja annak, hogy beállítson egy szál nevét a programjában, az, hogy egy speciálisan konfigurált kivétel dobásával, amely közli a kívánt szál nevét a Visual Studio hibakeresőjével.

Előnyök:

  • A Visual Studio minden verziójában működik.

Figyelmeztetések

  • Csak akkor működik, ha a hibakereső a kivételalapú metódus használatakor van csatolva.
  • Az ezzel a módszerrel beállított szálnevek nem érhetők el a letöltésekben vagy a teljesítmény-elemző eszközökben.

Example:

Az SetThreadName alábbi függvény ezt a kivételalapú megközelítést mutatja be. Vegye figyelembe, hogy a szál nevét automatikusan átmásolják, így a threadName paraméter memóriája a SetThreadName hívás befejezése után felszabadítható.

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

Szálnév beállítása felügyelt kódban

A szál elnevezése a Visual Studio bármely kiadásában lehetséges. A szálak elnevezése hasznos a szálak nyomon követéséhez a Szálak ablakban.

Ha a szál nevét szeretné beállítani a felügyelt kódban, használja a Name tulajdonságot.

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