0

Mac OS でマルチスレッド アプリケーションを開発しています。次の問題に直面しています: xcode-cocoa アプリケーションでデバッグしようとすると (注: コンソール アプリケーションには同じ問題はありません)、スレッドは次の呼び出しでエラーを返します: kevent()、semaphore_wait() 、EINTR (kevent の場合) および KERN_ABORTED (semaphore_* の場合) を指定した semaphore_timedwait()。これはlldbの作業によるものだと思います。

問題は、このようなイベントを受け取った後にクラッシュするため、アプリケーションをデバッグできないことです。私がそれらの処理を行う場合(同じ機能をリコールするだけ)、アプリケーションは非常に奇妙に動作します。とにかく、新しい timedwait() を正しくするために timedwait() に行く前に時間を「記憶」する必要があるため、semaphore_timedwait() が中断するような状況を適切に処理することはできません (できますが、非常に醜いです)。

したがって、私の問題の解決策は、現在のスレッドの「中断」を無効にできる場合です-別のスレッド\プロセスから中断される機能であり、lldbが何らかのシグナルを送信した場合、関数は返されません。mac osで可能ですか?

4

1 に答える 1

0

いくつかのメモ:

  1. 一部のdebugegrs(gdbがそれをサポートしていることは知っています)では、すべてのスレッドがブレークポイントで停止するか、1つだけが停止するかを指定できます。

  2. 一般に、コードで準備ができている必要があります。それがより多くの作業であっても、シグナルが届きます。

  3. マルチスレッドアプリケーションでは、ほとんどの(ヘルパー)スレッドでシグナルをブロックすることを検討できるため、シグナルはその準備ができているスレッドで処理される必要があります。を参照してくださいpthread_sigmask()

于 2012-06-01T12:41:17.717 に答える