|
蓝森林 http://www.lslnet.com 2006年6月6日 10:18
@程序在测试机上跑没问题,现场莫名其妙的退出@
写的一个deamon程序,在测试机器上跑了两天,没有一点问题。
可是放到现场总是跑上几个小时就莫名其妙的退出。并且日志没有任何异常。也没有core dump
程序大概的功能就是作为server端接收client进程A发过来的消息,然后处理消息,将处理完的消息封包,通过socket发送给另一个进程B。程序中处理了 sigpipe,sighup等信号,当B产生sigpipe时打印syslog,不退出。现场进程A,B运行正常。ps查看进程没有内存泄漏。
现场数据量比较大(大概1秒钟一条),消息处理用到较多的stl函数。我在测试机上模拟0.5秒发送一条消息。跑了两天也没有任何异常。 |
建议贴出部分代码和ps查询结果,否则真不好分析 |
代码得摘出来,现在没时间,晚上看看。
ps结果:
[code]
bash-2.03$ ps -efl |grep nokia
8 S probe 2953 16939 0 50 20 ? 138 ? 10:16:34 pts/10 0:00 grep nokia
8 S probe 27009 1 0 40 20 ? 374 ? 10:08:25 ? 0:00 ./nokia_alarmPrb -d
[/code] |
可能封包边界处理不对 |
回复 4楼 liubinbj 的帖子
你说的封包边界指的是???
我封包的包头用的是两byte16进制的消息总长度,然后每个消息字段前用的是一个byte的每个字段的16进制长度。
我测试机上运行的A,B进程和现场的是一样的,要是封包边界不对的话,测试机上应该也会有问题的吧。 |
这种情况经常会碰到的.
无非两种情况
1.现场环境和测试环境的差别.
2.程序本身不健壮,测试用数据未能覆盖到在线系统的所有情况. |
回复 6楼 unicorns 的帖子
这种问题最不好找了,不知从哪找起 |
lz做安全的? |
回复 6楼 unicorns 的帖子
碰到这种问题,该怎么解决? |
现场进程在调试器下运行,设断点exit/_exit. |
不是有core dump吗?跟进去啊,看在哪里异常的,还有最好检测一下初始化的那些函数,看有什么遗漏的或者是多处理的 |
sigpipe,sighup等信号!看看信号处理用的什么函数?signal?信号处理在特定情况下有不确定行为,叫不安全信号,建议用sigaction |
是solaris系统么? |
回复 12楼 cattiger 的帖子
我用的sigaction,在solaris系统下跑,测试机和现场机器都是solaris |
如果是solaris,可以用命令truss来动态查看系统调用和自己的函数调用。
man truss |
| |