スタックをクロールするためのコードがいくつかあります。そうするときに現在の時刻をダンプできると非常に便利です。残念ながら、このlocaltime_r()
関数は再入可能ですが、シグナルセーフではなく、一部のプラットフォームでは内部pthreadミューテックス関数を呼び出していることがわかります。
0: c000000000436b90 : __ksleep() + 0x30 (/usr/lib/hpux64/libc.so.1)
1: c000000000152060 : __spin_lock_spin() + 0x1b0 (/usr/lib/hpux64/libpthread.so.1)
2: c0000000001d3da0 : __pth_bound() + 0x160 (/usr/lib/hpux64/libpthread.so.1)
3: c0000000001d9080 : __mxn_wakeup() + 0x140 (/usr/lib/hpux64/libpthread.so.1)
4: c0000000001429a0 : __pthread_mutex_unlock_ng() + 0x940 (/usr/lib/hpux64/libpthread.so.1)
5: c000000000142040 : pthread_mutex_unlock() + 0x20 (/usr/lib/hpux64/libpthread.so.1)
6: c000000000458370 : __thread_mutex_unlock() + 0xb0 (/usr/lib/hpux64/libc.so.1)
7: c000000000321cd0 : __localtime_r_posix() + 0x7e0 (/usr/lib/hpux64/libc.so.1)
gettimeofday()
ただ呼び出して(「フォローアップlocaltime_r()
呼び出しで時間をきれいに印刷する」を省略して)、スタックトレースファイルを後処理することで、時間を安全にダンプできます。このアイデアにはいくつかの問題があります。可能。
シグナルハンドラーの外部で後処理を必要とせずに、localtime
シグナルセーフである同様の結果を達成するための既知の他の方法はありますか?