我可以在Xcode中指定自己的“线程名称”吗?

时间:2012-09-24 17:55:57

标签: xcode multithreading nsthread

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这样的东西? :)

enter image description here

4 个答案:

答案 0 :(得分:9)

可能不是完全你想要的东西但是NSThread有setName:方法允许你设置线程的名字,你可以在线程上附加有意义的名字,这样你就可以在调试器中得到以下内容:

[[NSThread mainThread] setName:@"That is main thread!"];

enter image description here

还要记住,某些api(如大中央调度)与线程池一起运行,因此无法保证您的操作将在哪个线程上执行

修改 com.apple.main-threadcom.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")