2012-06-06 77 views
1

我們已經有了一些代碼來抓取堆棧,並且當我們這樣做時能夠轉儲當前時間非常方便。不幸的是,雖然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

回答

0

我想出了一個解決這個問題的方法。調用localtime用於信號上下文以外的進程的另一個線程,並在清除小時/分鐘/秒字段(以及該操縱的struct tmmktime結果)後緩存該值。

只要我有自上次緩存值以來的24小時內的值,我可以在信號處理程序中使用它,手動構建處理程序中的gettimeofdaystruct tm,方法是以小時/分鐘/ sec字段爲來自緩存時間點的增量。

這並不完美,並且有一些棘手的方面可以確保我不讀取處理程序執行時正在更新的值,但在大多數情況下,我可以避免後處理post mortem轉儲文件,而不會陷入或掛起由於處理程序中的信號不安全功能。

相關問題