Xcode的“线程列表”窗格显示了几个特殊线程的英文名称:com.apple.main-thread,com.apple.libdispatch-manager,com.dispatchfractal.opencl,com.dispatchfractal.opengl,com.apple .root.low-priority,...但对于用户创建的线程,该字段只是空白。
有没有办法以编程方式从我的应用程序中设置“线程名称”字段?例如,如果我有一个专门用于网络I / O的线程,我希望它在调试器中显示为“com.example.network-io”;如果我生成五个工作线程,我希望能够将它们命名为“worker A”,“worker B”等.Xcode是否可以从我可以挂钩的某些API中获取其线程名称?也许像CFAssignDebuggerNameToCurrentThread
这样的东西? :)
答案 0 :(得分:9)
可能不是完全你想要的东西但是NSThread有setName:
方法允许你设置线程的名字,你可以在线程上附加有意义的名字,这样你就可以在调试器中得到以下内容:
[[NSThread mainThread] setName:@"That is main thread!"];
还要记住,某些api(如大中央调度)与线程池一起运行,因此无法保证您的操作将在哪个线程上执行
修改强>
com.apple.main-thread
,com.apple.libdispatch-manager
等是相应调度队列的标签。您可以使用dispatch_queue_create
函数创建队列时设置标签值,然后使用dispatch_queue_get_label
函数从队列中获取标签值。
似乎没有API可以更改现有调度队列的标签值,我也不建议更改系统队列的标签。
答案 1 :(得分:3)
如果您可以获得要更改其名称的线程的引用,则可以在调试器控制台中更改它。当前线程有两种方法:
(lldb) po [[NSThread currentThread] setName:@"foo"]
(lldb) expression (void)[(NSThread*)[NSThread currentThread] setName:@"foo"];
我猜你可以从一个有关联表达式的断点做同样的事情。如果您有一个您知道将在您感兴趣的线程中运行的方法,则可以设置包含上述命令之一的断点,并在运行该命令后自动继续。这样就可以在每次运行代码时自动设置线程的名称,这对于调试来说非常方便。
答案 2 :(得分:1)
pesudo代码 - [NSThread setName:]
- (void) setName:(NSString*)thname {
if (self == [NSThread currentThread])
{
pthread_setname_np([thname UTF8String]);
}
else { ... }
...
}
因此,设置名称的简单方法是调用 pthread_setname_np 。
答案 3 :(得分:0)
我在Swift 5中使用以下代码来重命名当前线程:
pthread_setname_np("myThreadName")