cxm240 发表于 2013-06-27 16:29

在信号处理函数中调用backtrace来打印调用栈

在信号处理函数中调用backtrace来打印调用栈,存在安全问题吗,比如可重入问题、阻塞问题等

卖萌犯法 发表于 2013-06-28 11:12

存在安全隐患,但不一定会导致问题,因为backtrace 向I/O输出前,可能有其它线程也向该I/O输出,如果该I/O的写访问是互斥的,而其它线程正在输出时被backtrace 挂起,则会导致backtrace 被阻塞,如果backtrace 被阻塞,则可能导致重入

linux_c_py_php 发表于 2013-06-28 11:20

随便用, buffer是用户提供的, 没有线程安全问题.

cxm240 发表于 2013-07-13 16:20

那么如果I/O不是阻塞的话,就没任何问题了吗
回复 2# 卖萌犯法


   

myworkstation 发表于 2013-07-13 23:00

回复 1# cxm240


    其实所有的问题本质上只是一个“Async-Signal-Safe Function”调用问题,你要保证你在signal handler中调用函数都是“Async-Signal-Safe Function”的,这将保证不会有错误(否则会发生死锁等状况,但毕竟调用会被中断不能保证逻辑上的正确性,比如说字符输出了一半等)。根据你设置signal handler的不同,“Async-Signal-Safe Function”将具有不同的行为。使用signal设置signal handler默认设置了SA_RESTART标志位。这个标志位可以使用sigaction修改。如果设置了SA_RESTART那么在signal handler中的阻塞调用被另一个信号中断时将重启,否则返回EINTR。由于glibc中的自己会作信号处理,所以调用printf这样的函数将会导至不确定性。也就是说如果你想保证输出backtrace安全,不能调用printf这样的glibc中的函数,而应该调用符合“Async-Signal-Safe Function”标准系统函数write向终端中输出,虽然也不能保证输出完整性,但可以保证程序不会出现错误。如果要做的更完善那么可以把可以阻塞的信号都阻塞掉来尽量保证输出的完整性。但这样的意义已经不太大了。

卖萌犯法 发表于 2013-07-14 00:55

回复 4# cxm240


    理论上是的,没有试验过,不确定
页: [1]
查看完整版本: 在信号处理函数中调用backtrace来打印调用栈