如何获取Win32线程的名称?

16

1
如果有帮助,您可以获取线程的启动函数名称。 - Nawaz
@Nawaz 你会怎么做? - CS.
1
@CS:你需要使用这些API:SymInitializeSymFromAddr。我已经使用过它们了,可以看看这个主题:从另一个进程获取win32线程的StartAddress - Nawaz
3个回答

18

在Win32中,线程实际上没有名称。通过RaiseException方法与VS调试器进行"秘密握手",才能将TID(线程ID)和名称进行映射存储。Windows本身并不知道线程的"名称"。


18

从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


12

由于不存在线程名称,因此不存在WinAPI调用。

如果您设置了线程名称,则IDE的调试器将为您存储它,这使得调试更加容易。 但是,该名称从未通过Windows API调用真正附加到线程上。

如果在没有调试器的情况下运行应用程序,则设置线程名称无效,因此您无法检索名称。

即使可以访问-我也不会编写仅在附加调试器时才有效的代码。最好将名称与句柄一起存储。


1
你是说在调试器中设置的线程名称无法获取吗? 我想在我的代码中放置一些调试检查,以确保它是从正确的线程调用的,使用线程名称。 - 0x26res
线程0x66c已退出,状态代码为0(0x0)-> 我想,也许0x66c是类似于名称之类的东西? - Andre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接