|
发表于 2007-10-13 08:29:38
|
显示全部楼层
Post by tjuprogram
使用信号还是不能太好的解决这个问题。意味着要将同一个异常处理函数注册成很多信号的处理函数。
而且有些信号(SIGKILL 和 SIGSTOP),是不能注册处理函数的,这样的话,如果发生这些信号,还是无法输出堆栈信息。
另外,有些嵌入式系统中使用ucLibc库,根本就不支持backtrace_symbols等函数,郁闷...
很多大型软件就是将一个函数注册成很多信号的处理函数的。比如,Emacs 将 SIGINT 和 SIGQUIT 都注册为 interrupt_signal;Gambit 将 SIGINT, SIGQUIT, SIGWINCH 和 SIGCONT 都注册为 tty_signal_handler。我不认为将一个异常处理函数注册成很多信号的处理函数是个问题。相反,在特定的情况下,没有其他的解决方法。
SIGKILL 通常是显式地发出的,例如,用 kill -9。这时更多地说明用户希望中止应用程序,而不是程序有问题。通常,这也说明清理工作是不必要的,因为用户可能认为程序不应该这样执行,而系统会帮你清理。SIGSTOP 用于停止应用程序,但不久,如果程序收到 SIGCONT,那么程序会继续运行。这也不是程序本身有问题的现象。所以,这两个信号通常并不是程序本身有问题的反映,也不必在这里费心做清理工作。
如果你用 GCC,那么可以试着将 backtrace 的功能编译进你的程序,而不是通过 glibc 来调用它。事实上,backtrace 调用了 GCC 提供的函数 __builtin_frame_address 等,它的实现并不复杂。你可以读读 backtrace 的源代码。 |
|