10

Xcode 的“线程列表”窗格显示了几个特殊线程的类似英文的名称:com.apple.main-thread、com.apple.libdispatch-manager、com.dispatchfractal.opencl、com.dispatchfractal.opengl、com.apple.root。低优先级,...但是对于用户创建的线程,该字段只是空白。

有没有办法从我的应用程序中以编程方式设置“线程名称”字段?例如,如果我有一个专门用于网络 I/O 的线程,我希望它在调试器中显示为“com.example.network-io”;如果我产生五个工作线程,我希望能够将它们命名为“worker A”、“worker B”等。Xcode 是否从一些我可以挂钩的 API 中提取它的线程名称?也许像CFAssignDebuggerNameToCurrentThread什么?:)

在此处输入图像描述

4

4 回答 4

11

可能不完全是您想要的,但 NSThread 具有setName:允许您设置线程名称的方法,您可以将有意义的名称附加到线程,因此您将在调试器中获得以下信息:

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

在此处输入图像描述

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

编辑: com.apple.main-threadcom.apple.libdispatch-manager是相应调度队列的标签。您可以在使用函数创建队列时设置标签值,dispatch_queue_create然后使用函数从队列中获取它dispatch_queue_get_label

似乎没有 API 可以更改现有调度队列的标签值,我也不建议更改系统队列的标签。

于 2012-09-24T17:58:03.937 回答
4

如果您可以获得对要更改名称的线程的引用,则可以在调试器控制台中更改它。为当前线程执行此操作的两种方法:

  • (lldb) po [[NSThread currentThread] setName:@"foo"]

  • (lldb) expression (void)[(NSThread*)[NSThread currentThread] setName:@"foo"];

我猜你可以从一个有关联表达式的断点做同样的事情。如果您有一个知道将在您感兴趣的线程中运行的方法,您可以设置一个包含上述命令之一的断点,并让它在运行该命令后自动继续。这将产生每次运行代码时自动设置线程名称的效果,这对于调试可能很方便。

于 2012-09-24T18:23:20.960 回答
2

我在 Swift 5 中使用以下代码重命名当前线程:

    pthread_setname_np("myThreadName")
于 2020-08-17T16:37:58.347 回答
1

-[NSThread setName:] 的伪代码

- (void) setName:(NSString*)thname {
    if (self == [NSThread currentThread])
    {
        pthread_setname_np([thname UTF8String]);
    }
    else { ... }
    ...
}

因此,设置名称的最简单方法是调用pthread_setname_np

于 2016-12-23T14:39:58.780 回答