LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: tjuprogram

如何在程序异常退出前输出当前进程的堆栈信息

[复制链接]
发表于 2007-10-11 09:12:46 | 显示全部楼层
主要在这里:

http://www.gnu.org/software/libc ... toc_Signal-Handling

有两点需要注意:

一,有些信号,比如 SIGKILL 和 SIGSTOP,这些信号的行为是无法改变的。

二,如果你希望退出程序,一定要用同样的信号来退出它( http://www.gnu.org/software/libc ... mination-in-Handler )。有关这样做的一个解释可以查看这里:http://www.cons.org/cracauer/sigint.html
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-12 20:24:51 | 显示全部楼层
使用信号还是不能太好的解决这个问题。意味着要将同一个异常处理函数注册成很多信号的处理函数。
而且有些信号(SIGKILL 和 SIGSTOP),是不能注册处理函数的,这样的话,如果发生这些信号,还是无法输出堆栈信息。

另外,有些嵌入式系统中使用ucLibc库,根本就不支持backtrace_symbols等函数,郁闷...
回复 支持 反对

使用道具 举报

发表于 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 的源代码。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表