2012-02-20 66 views
13

我知道在Windows下设置线程名称的非直观过程(请参阅“How to set name to a Win32 Thread?”)。有没有办法获得线程的名称?我没有看到任何允许我这样做的Windows API(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx)。如何获取Win32线程的名称?

+1

你可以得到线程的启动函数名称,如果可以帮助您以任何方式。 – Nawaz 2012-02-20 19:26:07

+0

@Nawaz你会怎么做? – 2012-08-09 11:57:48

+1

@CS .:您必须使用这些API:[SymInitialize](http://msdn.microsoft.com/en-us/library/windows/desktop/ms681351%28v=vs.85%29.aspx)和[SymFromAddr](http://msdn.microsoft.com/en-us/library/windows/desktop/ms681323%28v=vs.85%29.aspx)。我使用它们,请参阅本主题:从另一个进程中取得的Win32线程的StartAddress(http://stackoverflow.com/questions/8679406/get-startaddress-of-win32-thread-from-another-process) – Nawaz 2012-08-09 12:29:24

回答

12

有,因为不存在这样的东西线程的名字没有这样的WinAPI的电话。

如果您设置线程名字,那么你的IDE将它保存为你,这使得它更容易调试的调试器。 但是,这个名称从来没有真正通过Windows API调用附加到线程。

如果你没有一个调试器,然后设置线程名运行你的应用程序没有任何影响,因此,你不能检索名称。

即使这将是访问 - 我不会写,只有上附加一个调试运行的代码。最好将自己的名字与手柄一起储存起来。

+0

你是否说绝对没有办法获得你在调试器中设置的线程名称? 我想在我的代码中进行一些调试检查,以确保它从正确的线程调用,使用线程名称 – Arthur 2012-11-16 12:00:59

+0

线程0x66c已退出代码0(0x0) - >我想,也许0x66c是类似的东西一个名字 ? – Andre 2015-11-04 07:20:30

17

线程在Win32中实际上没有名称。通过RaiseException的过程只是与VS调试器的“秘密握手”,他实际上存储了TID =>名称映射。 Windows本身没有线程“名称”的概念。

7

从Windows 10版本1607开始,现在可以使用GetThreadDescription()获取线程的名称,假设使用SetThreadDescription()来设置线程的名称。

下面是一个例子:

HRESULT hr = GetThreadDescription(ThreadHandle, &data); 
if (SUCCEEDED(hr)) 
{ 
    wprintf(“%ls\m”, data); 
    LocalFree(data); 
} 

这里的文档:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt774972(v=vs.85).aspx