Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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
@TIBablakban vagy a Gyorsóra párbeszédpanelen beírva tekintheti meg.Az aktuális szál utolsó hibakódját a
@Errablak 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();
}