関数呼び出しおよび show_self の制約事項は、次のとおりです。
- exec() を呼び出すことはできません。
- スレッドまたはプロセスを終了することはできません。
- シグナルを発行することはできません。
- longjmp() のターゲットが関数内にない限り、longjmp() を
呼び出すことはできません。
- 関数内で処理される例外でない限り、C++ 例外を発行することはできません。
- 適度な時間内に終了しなければなりません。これは、
DER_DBG_SHOWSELF_TIMEOUT 環境変数で制御できます。デフォルト値は 10 秒です。
- この関数は、マルチスレッド・アプリケーションでは、どのスレッドで実行するのかに関する
仮定を行うことができず、プロセス内の他のすべてのスレッドが中断されていると
想定しなければなりません。特に、次の点に注意してください。
- この関数は、他のスレッドに依存できず、必要なリソースを他のスレッドが保持している
可能性があると想定しなければなりません。特に、pthread_mutex_lock() の呼び出しは、
この関数がハングする原因になることがあります。
- すべての C/C++ ライブラリー関数が再入可能であるわけではありません。メモリー割り振り関数や入出力関数も含めて、
libc.a 内の多くのスレッド・セーフ関数は、再入可能ではありません。それらの関数は逐次再使用可能です。それらの
関数は、pthread_mutex_lock() を使用して逐次再使用可能性を実装するので、
それらの関数の呼び出しによるデバッグ・セッションのハングは、低い確率でしか起こりません。
- デバッグ対象プロセスのグローバル状態に対して関数が加える変更は、
関数が戻った後もすべてそのまま継続します。
- pthread_create() 呼び出しの効果は定義されていません。
- show_self 関数には、出力をコンソールに向ける呼び出しが含まれています。これらの呼び出しには、printf()、fprintf()、および cout クラスが含まれています。デバッガーはこれらの関数を評価するとき、デバッグ対象の任意の 1 つのスレッド上で show_self 関数を実行し、その間は他のすべてのスレッドは凍結されます。したがって、他のスレッドが実行中であることを必要とする呼び出しはすべて失敗します。
- コンソールに出力する呼び出しは、比較的影響の少ない方法で失敗しますが、これは単に出力が存在しないためです。
- デッドロックが発生する可能性がわずかに存在します。これは、多くの C/C++ ライブラリー関数 (入出力関数およびメモリー割り振り関数を含む) が、mutex によって保護されている再入不可コードを呼び出す必要があるためです。
- 関数は、 または exec() を呼び出すことができず、スレッドを終了できません。
上記の制約事項のいずれかが
満たされていない場合、デバッガーはリカバリーを試みます。ただし、デバッグされるアプリケーションの状態が取り返しのつかないほど
変更されることがないという保証はありません。