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」として表示されるようにします。5 つのワーカー スレッドを生成する場合、それらに「ワーカー A」、「ワーカー B」などの名前を付けたいと思います。Xcode は、自分自身にフックできる API からスレッド名を取得しますか? 多分何かのようなCFAssignDebuggerNameToCurrentThread?:)

ここに画像の説明を入力

4

4 に答える 4

11

おそらくあなたが望むものではありませが、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 はないようです。システム キューのラベルを変更することはお勧めしません。

于 2012-09-24T17:58:03.937 に答える
4

名前を変更したいスレッドへの参照を取得できる場合は、デバッガー コンソールで変更できます。現在のスレッドでこれを行うには、次の 2 つの方法があります。

  • (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 に答える