1

スタックをクロールするためのコードがいくつかあります。そうするときに現在の時刻をダンプできると非常に便利です。残念ながら、この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シグナルセーフである同様の結果を達成するための既知の他の方法はありますか?

4

1 に答える 1

0

私はこの問題の回避策を思いついた。シグナルコンテキスト外のプロセスに対して別のスレッドを呼び出しlocaltime、時間/分/秒のフィールドをクリアした後に値をキャッシュします(mktime操作された結果とともにstruct tm)。

最後にキャッシュされた値から24時間以内の値がある限り、シグナルハンドラーでその値を使用し、デルタの時間/分/秒フィールドに追加してハンドラー内のstruct tmを手動で作成できます。gettimeofdayキャッシュされた時点から。

これは完全ではなく、ハンドラーの実行中に更新されている値を読み取らないようにするためのトリッキーな側面がいくつかありますが、ほとんどの場合、事後ダンプファイルの後処理を回避でき、信号が安全でないためにトラップまたはハングすることはありませんハンドラー内の関数。

于 2012-06-29T03:34:32.677 に答える