我們已經有了一些代碼來抓取堆棧,並且當我們這樣做時能夠轉儲當前時間非常方便。不幸的是,雖然localtime_r()
功能是折返的,它不是信號安全,我們看到它呼籲在一些平臺內部的並行線程互斥功能:是否有localtime_r()的信號安全替代方案?
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
?