我有一个守护进程 ( slapd
),有时会无缘无故地停止。不会发生段错误。日志中没有什么特别的。
因此,我试图用来acct
跟踪进程的生命周期,特别是它的退出值。表示man
内核确实记录了该值。令人惊讶的是,我的dump-acct
没有显示此信息......
我必须通过在print_pacct_record()
函数中添加此行来更改源:
(void)fprintf(out, "%4u|", rec->ac_exitcode >> 8);
编辑:此更改已最近添加了主流。
但是,我觉得这还不足以发现问题所在。
有没有更好的方法来跟踪程序如何退出?例如,堆栈跟踪会很有趣。 “最后几秒跟踪”会更好。
我想到了strace
或者,ltrace
但是程序可以运行几天,然后才会“自行停止”。我担心“跟踪”会影响性能。我不知道是否gdb
可以提供帮助。
答案1
strace
如果您使用该选项并将其输出重定向到文件会怎么样-o
?
[root@host ~]# strace -o /root/slapd_strace.log slapd --parameters --you --want
答案2
尝试strace
在 或 下screen
运行tmux
。一旦运行,您就可以断开连接,并且仅在需要时重新连接。screen
保留一个滚动缓冲区(可能如此tmux
),因此您甚至不需要担心重要的线索滚动到页面顶部。
screen -h 1000
strace ...
# disconnect with Ctrl-a d
之后
screen -r