您的位置:程序门 -> linux/unix社区 -> 程序开发区



linuxgdb里运行正常, 但非gdb运行就异常退出, 而且还不生成core文件.


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


linuxgdb里运行正常, 但非gdb运行就异常退出, 而且还不生成core文件.[已结贴,结贴人:longenic]
发表于:2007-08-21 13:58:47 楼主
程序运行环境为   red   hat     a4   linux,           写了一个网络服务程序,     奇怪的是服务在gdb里面跑就运行正常,       但是在非gdb环境下跑,   就异常退出,   而且还不生成core文件.    

      我查这个问题已经一个多星期,   郁闷死了,   现在还不知该怎么下手.
发表于:2007-08-21 14:32:291楼 得分:0
1,有可能是时间同步的原因.
2,内存溢出.
发表于:2007-08-21 14:56:262楼 得分:0
先把程序的断点找出来,如果每次都一个地方,
就顺藤摸瓜,找出问题点。

有个工具比较好用,可以跟踪一下程序走向
http://ndevilla.free.fr/etrace/

另外一个思路是,截获信号,把堆栈里的内容打出来,
来确定问题点。
发表于:2007-08-21 15:20:133楼 得分:0
to   cceczjxy()  
1.     时间同步和异常退出有什么关系?
2.     内存溢出应该有core文件才对,       但在gdb环境下是正常的.

to   warabi(厥)
1.     因为gdb环境跑不出bug,       正常情况下又不生成core,     没有办法确定断点,       而且这个bug一般运行一天才会出来一次,   很难定位到问题.
2.     应该捕获哪些信息?         怎么在程序中打印出堆栈?         能不能讲的详细些!
发表于:2007-08-21 15:36:254楼 得分:20
为了生成coredump,设定一下环境

ulimit   -c   unlimited

参考:
http://justlinux.com/forum/archive/index.php/t-136325.html
发表于:2007-08-21 15:52:245楼 得分:20
to   cceczjxy()
1.   时间同步和异常退出有什么关系?
2.   内存溢出应该有core文件才对,   但在gdb环境下是正常的.


------------------------------------
1,说错了,不是时间同步,是线程间的同步,你的程序是多线程的不?如果不是就没有这样的错误了.

2,生不生成core,要看你的设置了,你设置的允许生成core文件不?


不管怎样,应该先定位到错误的位置再说.


3,网络服务程序?你检查一下各种信号,看是那中情况退出的.
我以前遇到过一种情况:
服务端从客户端读取请求数据后,一阻塞方式处理数据(时间不长),处理完成后继续从客户端读取数据.
测试时发现,如果在处理数据时客户端主动断开连接,那么在处理完数据后读取数据的时候,就会产生pipe
信号.但是,如果数据处理的时间短的话,处理时断开连接则不会出现那样的情况.
发表于:2007-08-21 17:50:056楼 得分:0
关于core文件的设置为   ulimit     -c     10240000
但就是不生成core,         我还测试过,     特别加了一个bug,     就可以core出来的.     但这次异常退出就是不生成core,   根本就没有办法定位问题.


关于pipe信号,   我也怀疑过这点,       我在程序已经加已经加了pipe信号的捕获,   但根椐日志来看,   没有进行信号的回调函数,     我怀疑是信号没有捕获成功.  

发表于:2007-08-21 17:53:317楼 得分:0
奇怪,   就算pipe信号没有捕获,     异常退出的话,   也应该生成core啊.
发表于:2007-08-21 18:00:368楼 得分:0
异常退出不生成core?   那还叫异常退出吗?   那叫正常退出.
一定会生成core的,   是你设置不对.
去我的blog上看那篇linux   core   dump的文章吧
发表于:2007-08-22 16:13:409楼 得分:0
异常退出就一定会生成core吗?       难道没有不生成core的异常退出??
发表于:2007-08-22 17:38:0210楼 得分:50
异常退出就一定会生成core吗?   难道没有不生成core的异常退出??

如果不是正常退出的那就是有信号引起的程序退出.有些信号确实能引起程序退出但不生成core;

sighup   终止进程   终端线路挂断
sigint   终止进程   中断进程
sigquit   建立core文件终止进程,并且生成core文件
sigill   建立core文件   非法指令
sigtrap   建立core文件   跟踪自陷
sigbus   建立core文件   总线错误
sigsegv   建立core文件   段非法错误
sigfpe   建立core文件   浮点异常
sigiot   建立core文件   执行i/o自陷
sigkill   终止进程   杀死进程
sigpipe   终止进程   向一个没有读进程的管道写数据
sigalarm   终止进程   计时器到时
sigterm   终止进程   软件终止信号
sigstop   停止进程   非终端来的停止信号
sigtstp   停止进程   终端来的停止信号
sigcont   忽略信号   继续执行一个停止的进程
sigurg   忽略信号   i/o紧急信号
sigio   忽略信号   描述符上可以进行i/o
sigchld   忽略信号   当子进程停止或退出时通知父进程
sigttou   停止进程   后台进程写终端
sigttin   停止进程   后台进程读终端
sigxgpu   终止进程   cpu时限超时
sigxfsz   终止进程   文件长度过长
sigwinch   忽略信号   窗口大小发生变化
sigprof   终止进程   统计分布图用计时器到时
sigusr1   终止进程   用户定义信号1
sigusr2   终止进程   用户定义信号2
sigvtalrm   终止进程   虚拟计时器到

把可能的信号都设置上句柄,看是那种情况.
发表于:2007-08-22 17:59:5711楼 得分:0
不是吧,   sigsegv就是segment   fault,   这个是产生core的,   还有sigfpe浮点错误,   这些都是产生core的.
异常退出的定义是:   在退出之后,   如果fileno_stdout定向在terminal,   会输出异常退出提示,   这种就是异常退出.
你ctrl+c退出是sigint,   是中断退出,   不是异常退出.
发表于:2007-08-23 10:00:1612楼 得分:10
不是吧,   sigsegv就是segment   fault,   这个是产生core的,   还有sigfpe浮点错误,   这些都是产生core的.

--------------------------------------------
sigsegv   建立core文件   段非法错误
sigfpe   建立core文件   浮点异常

没说它不建立core文件呀
发表于:2007-08-23 10:18:3313楼 得分:0
谢谢各位,   经过各位的指教,   总算有点思路了.

我的网络服务器虽然写了捕获pipe的信号,     但从日志上看的确是没有进入过个回调函数.   应该是这个信号捕获不成功.
sigpipe   终止进程   向一个没有读进程的管道写数据


但还是有一个疑问,     如果是直接gdb运行,     难道就默认把这些信号捕获了吗?       我曾经用gdb直接运行了三天,   都是运行正常的.
发表于:2007-08-23 11:07:1014楼 得分:0

我的网络服务器虽然写了捕获pipe的信号,   但从日志上看的确是没有进入过个回调函数.   应该是这个信号捕获不成功.
sigpipe   终止进程   向一个没有读进程的管道写数据

想想是不是你在那地方把它加入了信号屏蔽里,


快速检索

最新资讯
热门点击