LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4745|回复: 12

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

[复制链接]
发表于 2007-9-13 17:44:40 | 显示全部楼层 |阅读模式
最近系统经常由于莫名其妙的原因异常退出,由于代码规模比较大,
比较难定位,所以想在退出前输出堆栈信息,以便分析,
不知道如何实现?
另外,类似这种问题,不知道有什么有效的方法?

使用开发语言:C++
开发平台:linux 2.6.12
发表于 2007-9-16 21:20:05 | 显示全部楼层
用ulimit打开系统的core dump吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-9 18:11:06 | 显示全部楼层
用ulimit也是一种办法, 但感觉还是不太方便.

在window下, 系统提供了一个回调的函数指针, 只要把我们自己写的异常处理函数挂上去, 那么当程序运行过程中, 不管发生什么异常, 在退出前都会调用我们挂上去的回调函数。这样, 在回调函数中, 就可以DUMP出当时的堆栈信息,可以方便定位各种问题了。

不知道LINUX有没有类似的机制?
回复 支持 反对

使用道具 举报

发表于 2007-10-9 22:20:01 | 显示全部楼层
用 gdb 运行的时候如果异常可以用 bt 命令查看各种各样的信息

另外用 strace 来运行你的程序可以检测所有的系统调用,尽管不是查看堆栈,但在某些时候也有助于分析错误

但要是想程序自身输出堆栈信息,这个就不知道了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-10 09:06:39 | 显示全部楼层
用户在家里实际使用时, 不可能进行任何调试。只能希望在异常时程序能自动DUMP出堆栈信息,并借助程序记录的各种日志来定位了。

只是不知道如何实现!
回复 支持 反对

使用道具 举报

发表于 2007-10-10 09:14:54 | 显示全部楼层
在 Glibc 的支持下,有这个方案:
  1. 1. 注册一个异常退出时的函数,所有的信息输出工作都在这个函数里完成。
  2. 2. 调用 backtrace 和 backtrace_symbols 来获取消息,或调用 backtrace_symbols_fd 来输出消息。
  3. 3. 编译源代码时,gcc 加上 -rdynamic 选项。
复制代码

有关第 2 点,可以参考 http://www.gnu.org/software/libc ... ces.html#Backtraces

不知道这个是否满足你的要求。
回复 支持 反对

使用道具 举报

发表于 2007-10-10 10:36:39 | 显示全部楼层
herberteuler兄,这东西不错啊。
你有没有用过的一些体会??
回复 支持 反对

使用道具 举报

发表于 2007-10-10 13:16:30 | 显示全部楼层
Post by realtang
herberteuler兄,这东西不错啊。
你有没有用过的一些体会??

除了 glibc 手册里的那个例子,我没用过。这是因为我的应用中用不到这样的特性。
回复 支持 反对

使用道具 举报

发表于 2007-10-10 16:09:35 | 显示全部楼层
能不能改一下信号处理函数??

不过好像需要改的信号比较多。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-10-10 19:35:18 | 显示全部楼层
Post by herberteuler
在 Glibc 的支持下,有这个方案:
  1. 1. 注册一个异常退出时的函数,所有的信息输出工作都在这个函数里完成。
  2. 2. 调用 backtrace 和 backtrace_symbols 来获取消息,或调用 backtrace_symbols_fd 来输出消息。
  3. 3. 编译源代码时,gcc 加上 -rdynamic 选项。
复制代码

有关第 2 点,可以参考 http://www.gnu.org/software/libc ... ces.html#Backtraces

不知道这个是否满足你的要求。


多谢herberteuler指点!不过还有点疑问,
第1条,“注册一个异常退出时的函数”,向哪儿注册?怎么注册呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

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