linux suse11遇到的信号问题以及一个coredump,想请教各路大神

fryhunter 2013-01-28 10:34:19
话就不多说,直接上问题。
1、信号问题:

fd_set rset;
FD_ZERO(&rset);
FD_SET(g_fdSocket, &rset);
//设置接收连接超时时间
struct timeval waitTime;
waitTime.tv_sec = 1;
waitTime.tv_usec = 0;
select(g_fdSocket + 1, &rset, NULL, NULL, &waitTime);

这一段代码,应该是会被阻塞,直到超时或者文件句柄g_fdSocket状态更新为对IO操作为ready。
本来工作也是正常的,但是假如我从控制台输入kill -15的时候,竟然会触发其终止阻塞。代码里面raise(15)与raise(8)却不会终止其阻塞。而且我代码里面如果使用了alarm闹钟,则闹钟时间到时也会终止其阻塞,而raise(SIGALRM)却不会终止。求解。


2、一个coredump的问题。一个网络多线程带信号处理的一个后台程序。我的程序运行得平常都很正常,但偶尔会coredump。用gdb查看堆栈信息的时候,却很郁闷的发现代码的最后一行运行在LOG("……");这样的代码行上,我怀疑日志出问题了,于是注释掉这句话,接着,花了很多遍重复,终于重现core的时候,发现更郁闷的事情发生了,core在了被注释掉的这句话的下一行。char mzchar[256];这样一个变量声明的语句上。错误的类型是11号信号段错误。coredump的这个方法是一个语法树里面的解析语法树的方法,因为一个表达式很长,语法树可能会层次很多,就是根树会调用这个方法去遍历解析他的儿子辈的。儿子当然也会调用这个方法去解析孙子辈分的,依次下去。这个方法是对象方法。还有一个信息就是这个coredump,我测很多遍,很大可能性是发生在程序退出的时候,被外部程序调用kill -9发送SIGKILL信号时发生的。我一直认为SIGKILL信号时不会发生coredump的。想请各路大神给点思路或者建议



...全文
294 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nevil 2013-01-29
  • 打赏
  • 举报
回复
内存访问出错都会导致段错误, 但是具体问题还是要靠代码具体分析...
引用 5 楼 fryhunter 的回复:
大神,继续追问下。栈溢出会导致段错误不?现在我启动线程的时候,设置的线程堆栈是2M。这个程序其实就是文件转换使用的。文件是存在很大的可能性的,有可能有10M,但是我内存里面设置的是到达1M之后就开始写文件,就是缓存的内容最大为1M。原文件是类似数据库那种记录,一条一条读的。但是现在coredump发生在刚读完一条记录的时候就core了,而这个core一般是不会出现的,只有……
fryhunter 2013-01-29
  • 打赏
  • 举报
回复
现在问题的症状比较像堆栈溢出。我现在给每个线程指定的堆栈大小为10M,32个业务线程同时工作,测了一天了,未出现coredump
引用 6 楼 nevil 的回复:
内存访问出错都会导致段错误, 但是具体问题还是要靠代码具体分析... 引用 5 楼 fryhunter 的回复:大神,继续追问下。栈溢出会导致段错误不?现在我启动线程的时候,设置的线程堆栈是2M。这个程序其实就是文件转换使用的。文件是存在很大的可能性的,有可能有10M,但是我内存里面设置的是到达1M之后就开始写文件,就是缓存的内容最大为1M。原文件是类似数据库……
fryhunter 2013-01-28
  • 打赏
  • 举报
回复
那个coredump的问题,现在确认和kill没关系了。我把业务线程换成8个,就是同时8个线程一起工作,用于表达式的数据转换。现在必core。core的地方还是一样的还是在那个log那边。而core的这个类是每个线程独有的。想知道这种情形有哪些可能导致的。
morris88 2013-01-28
  • 打赏
  • 举报
回复
怀疑你的原始代码写的有问题
fryhunter 2013-01-28
  • 打赏
  • 举报
回复
大神,继续追问下。栈溢出会导致段错误不?现在我启动线程的时候,设置的线程堆栈是2M。这个程序其实就是文件转换使用的。文件是存在很大的可能性的,有可能有10M,但是我内存里面设置的是到达1M之后就开始写文件,就是缓存的内容最大为1M。原文件是类似数据库那种记录,一条一条读的。但是现在coredump发生在刚读完一条记录的时候就core了,而这个core一般是不会出现的,只有我不断尝试kill -9我的进程,然后能偶尔发现他在启动的时候,刚开始文件转换,一条都没转完就core了。按理说这个时候也发生不了栈溢出。要是代码存在硬伤也应该必现,每次都core。现在很迷茫
引用 4 楼 nevil 的回复:
问题1,raise()是发送signal给calling线程 raise(3) Sends a signal to the calling thread. kill(2) Sends a signal to a specified process, to all members of a specified process gro……
nevil 2013-01-28
  • 打赏
  • 举报
回复
问题1,raise()是发送signal给calling线程 raise(3) Sends a signal to the calling thread. kill(2) Sends a signal to a specified process, to all members of a specified process group, or to all processes on the system. 你在select阻塞的时候,一定是另起了一个线程来raise() signal吧? 这样的话,你raise的信号是不会被select线程收到的,所以无法中断阻塞 问题2有可能是栈出问题了,因为你log函数参数要压栈,char mzchar[256]更是要分配栈空间 所以你要仔细地检查代码,是否有buff/数组溢出这样的问题
引用 楼主 fryhunter 的回复:
话就不多说,直接上问题。 1、信号问题: fd_set rset; FD_ZERO(&rset); FD_SET(g_fdSocket, &rset); //设置接收连接超时时间 struct timeval waitTime; waitTime.tv_sec = 1; waitTime.tv_usec = 0; select(g_……
fryhunter 2013-01-28
  • 打赏
  • 举报
回复
贴一段core的堆栈信息 Program terminated with signal 11, Segmentation fault. #0 TSyntaxTree::explainExp (this=0x98786e0, fieldValue=std::vector of length 60, capacity 60 = {...}, vParam=std::vector of length 1, capacity 1 = {...}, vVariable=std::vector of length 0, capacity 0, resultValue="", resultType=@0xf56cb254) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/syntaxtree.cpp:1120 1120 /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/syntaxtree.cpp: No such file or directory. in /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/syntaxtree.cpp (gdb) where #0 TSyntaxTree::explainExp (this=0x98786e0, fieldValue=std::vector of length 60, capacity 60 = {...}, vParam=std::vector of length 1, capacity 1 = {...}, vVariable=std::vector of length 0, capacity 0, resultValue="", resultType=@0xf56cb254) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/syntaxtree.cpp:1120 #1 0x080cf690 in TSyntaxTree::explainExp (this=0x9860610, fieldValue=std::vector of length 60, capacity 60 = {...}, vParam=std::vector of length 1, capacity 1 = {...}, vVariable=std::vector of length 0, capacity 0, resultValue="", resultType=@0xf576f344) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/syntaxtree.cpp:1232 #2 0x080cf690 in TSyntaxTree::explainExp (this=0x9860348, fieldValue=std::vector of length 60, capacity 60 = {...}, vParam=std::vector of length 1, capacity 1 = {...}, vVariable=std::vector of length 0, capacity 0, resultValue="", resultType=@0xf5813434) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/syntaxtree.cpp:1232 #3 0x080cf690 in TSyntaxTree::explainExp (this=0x972b220, fieldValue=std::vector of length 60, capacity 60 = {...}, vParam=std::vector of length 1, capacity 1 = {...}, vVariable=std::vector of length 0, capacity 0, resultValue="", resultType=@0xf58b7524) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/syntaxtree.cpp:1232 #4 0x080cf690 in TSyntaxTree::explainExp (this=0x972af58, fieldValue=std::vector of length 60, capacity 60 = {...}, vParam=std::vector of length 1, capacity 1 = {...}, vVariable=std::vector of length 0, capacity 0, resultValue="", resultType=@0xf58b75d0) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/syntaxtree.cpp:1232 #5 0x080bc5f0 in TParser::explainRESULT (this=0x97226a8, fieldValue=std::vector of length 60, capacity 60 = {...}, vParam=std::vector of length 1, capacity 1 = {...}, sResult=0x95249f8 "20121222210419") at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/parser.cpp:3107 #6 0x080bcd18 in TParser::explain (this=0x97226a8, fieldValue=std::vector of length 60, capacity 60 = {...}, vParam=std::vector of length 1, capacity 1 = {...}, sResult=0x95249f8 "20121222210419") at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/parser.cpp:1660 #7 0x0811792f in CConvertProcess::convertRecord (this=0x9524910, vParam=std::vector of length 1, capacity 1 = {...}) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/convertprocess.cpp:1175 #8 0x08118d43 in CConvertProcess::fileConvert (this=0x9524910, strFileName=Traceback (most recent call last): File "/usr/lib/../share/gdb/python/libstdcxx/v6/printers.py", line 469, in to_string return self.val['_M_dataplus']['_M_p'].string (encoding, length = len) OverflowError: signed integer is greater than maximum , bMoveFile=False) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/convertprocess.cpp:1706 #9 0x0811a001 in CConvertProcess::procException (this=0x9524910) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/convertprocess.cpp:1053 #10 0x080fa4e6 in CTask::run (this=0x9524910) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/taskprocess/taskprocessbase.cpp:213 #11 0x0805ec5c in ThreadFunc (pArgs=0x9524910) at /home/gww/mms_home/source/csrc/utl/billprocess/manager/source/common/base/commThread.cpp:37 #12 0xf7779725 in start_thread () from /lib/libpthread.so.0 #13 0xf75c51ce in clone () from /lib/libc.so.6

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧