如何为Win32线程设置名称。我没有找到任何Win32应用程序接口来实现同样的功能。基本上,我想在日志文件中添加线程名称。TLS (线程本地存储)是唯一的方法吗?
发布于 2009-05-25 08:36:51
这有帮助吗?How to: Set a Thread Name in Native Code
在托管代码中,只需设置相应Thread对象的Name属性即可。
发布于 2012-04-28 22:44:11
http://msdn.microsoft.com/en-us/library/xcb2z8hs(VS.90).aspx
//
// Usage: SetThreadName (-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, char* threadName)
{
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
__try
{
RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
}
发布于 2017-05-04 23:23:37
根据与微软调试团队领导的讨论(请参阅下面的链接以了解详细信息),SetThreadDescription应用程序接口是微软未来将使用的API,用于在本机代码中正式支持线程命名。我所说的“正式”是指MS支持的用于命名线程的API,而不是当前仅当进程在Visual Studio中运行时才有效的抛出异常的技巧。
此API从Windows 10版本1607开始可用。
但是,目前对工具的支持非常少,因此您设置的名称在Visual Studio或WinDbg调试器中不可见。然而,截至2017年4月,Microsoft xperf/WPA工具确实支持它(通过此API命名的线程将在这些工具中正确显示其名称)。
如果你想看到它获得更好的支持,比如在WinDbg、Visual Studio和崩溃转储文件中,请使用以下链接投票支持它:
https://stackoverflow.com/questions/905876
复制相似问题