免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: demongunner
打印 上一主题 下一主题

[C++] 求助一个程序崩溃的错误 [复制链接]

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
11 [报告]
发表于 2013-12-23 09:54 |只看该作者
回复 10# irp


    ------------symbol加载都成功了-----------
Core was generated by `./testpro'.
Program terminated with signal 11, Segmentation fault.
#0  0x00002b087ef5d0dd in vfprintf () from /lib64/libc.so.6
(gdb) bt
#0  0x00002b087ef5d0dd in vfprintf () from /lib64/libc.so.6
#1  0x00002b087ef7baf9 in vsprintf () from /lib64/libc.so.6
#2  0x00002b087e7c4631 in _e_gp_doulog () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libengine.so
#3  0x00002b087e7c6cec in userlog () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libengine.so
#4  0x00002b087e79a688 in _e_cryp_keye_one () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libengine.so
#5  0x00002b087df0977f in _wsc_conn () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libwsc.so
#6  0x00002b087defea82 in tpchkauth () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libwsc.so
#7  0x00002b087df0040c in _tpinit () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libwsc.so
#8  0x00002b087df0d06d in tpchkunsol () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libwsc.so
#9  0x00002b087df0d5a0 in _wsc_sighndler () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libwsc.so
#10 <signal handler called>
#11 0x00002b087ef4c200 in sigprocmask () from /lib64/libc.so.6
#12 0x00002b087e7a1cb1 in _e_sig_procmask () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libengine.so
#13 0x00002b087e39647b in _e_net_release_signals () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libgpnet.so
#14 0x00002b087df0d5db in _wsc_sighndler () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libwsc.so
#15 <signal handler called>
-------------此后是一直重复10-15条---------
#4555 <signal handler called>
#4556 0x00002b2869734200 in sigprocmask () from /lib64/libc.so.6
#4557 0x00002b2868f89cb1 in _e_sig_procmask () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libengine.so
#4558 0x00002b2868b7e47b in _e_net_release_signals () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libgpnet.so
#4559 0x00002b28686f55db in _wsc_sighndler () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libwsc.so
#4560 <signal handler called>
#4561 0x00002b286834bd7b in accept () from /lib64/libpthread.so.0
#4562 0x000000000040af51 in CServerSocket::InitInstance (this=0x5379f
    at /home/icd/test/testprogram/ServerSocket.cpp:300
#4563 0x00002b286849d23c in CWinThread::UNIXThreadProc (lParam=0x5379f at otherfuncs.cpp:42
#4564 0x00002b28683452a3 in start_thread () from /lib64/libpthread.so.0
#4565 0x00002b28697c542d in clone () from /lib64/libc.so.6
#4566 0x0000000000000000 in ?? ()
(gdb) f 4562
#4562 0x000000000040af51 in CServerSocket::InitInstance (this=0x5379f
    at /home/icd/test/testprogram/ServerSocket.cpp:300
warning: Source file is more recent than executable.
300                     NewSocket = accept(m_ListenSocket, (sockaddr *)&ClientAddr, (socklen_t*)&iAddrLen);
(gdb) p NewSocket
$1 = -1
(gdb)

大致就是这样 这次的gdb结果在accept 有时候是显示在select那,感觉好奇怪
中间那段重复了几千条的是tuxedo中间件的库。。。。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
12 [报告]
发表于 2013-12-23 12:42 |只看该作者
本帖最后由 irp 于 2013-12-23 12:44 编辑

移植程序的时候考虑过UNIX signal的处理吗?SIGIO/SIGPIPE etc. 这个行为和Windows下不同。

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
13 [报告]
发表于 2013-12-23 13:03 |只看该作者
回复 12# irp


    额,当时按照指导文档修改过框架后,然后一直出崩溃这问题。
然后accept的时候输出错误码4,是个什么Interrupted system call 然后就加了
#ifndef WIN32
        if ( WSAGetLastError() == EINTR )
        {
            continue;
        }
        else{
            printf("accept fail.");
        }
#else           
这段来屏蔽掉这个信号。
话说socket通信中还会有其他什么信号会对程序造成影响吗?linux下没怎么深入研究过,很多都不太了解。郁闷
对了,因为select始终在循环着,当时输出一下错误码,记得有0 有4 还有11什么的。。。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
14 [报告]
发表于 2013-12-23 21:43 |只看该作者
从bt来看,是stack overflow导致的segment fault. 如果你的程序没有处理signal, 这个signal被tuxedo注册的signal handler wsc_sighndler()接管,他实际上没有处理。这个signal handler反复被调用耗尽了stack, crashed。你是不是创建了nonblocking的socket? 你可以用gdb 在wsc_sighndler设置断点,看看得到的signal number是什么,在代码里屏蔽掉试试。

论坛徽章:
3
丑牛
日期:2013-11-13 10:22:35子鼠
日期:2013-11-18 18:10:04未羊
日期:2013-12-18 15:12:05
15 [报告]
发表于 2013-12-24 09:43 |只看该作者
回复 14# irp


下面是使用gdb去attach上这个程序的进程之后调试出错然后bt的结果,之前bt出的结果最后一直在accept select附近,这次到send函数那。不过为啥感觉send函数的那些参数都是正常的呢。这次好像是客户端这出现接收消息失败,然后把连接给删了,日志里记了Connection reset by peer。
使用了select应该就是非阻塞的socket吧。
我这程序只是调用了tuxedo的API函数,也能用gdb在tuxedo的相关函数里打断点吗?


    (gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1076898112 (LWP 2821)]
0x00002ac275bd30dd in vfprintf () from /lib64/libc.so.6
(gdb)




#4555 <signal handler called>
#4556 0x00002ac275bc2200 in sigprocmask () from /lib64/libc.so.6
#4557 0x00002ac275417cb1 in _e_sig_procmask () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libengine.so
#4558 0x00002ac27500c47b in _e_net_release_signals () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libgpnet.so
#4559 0x00002ac274b835db in _wsc_sighndler () from /home/icd/test/tuxedo/tuxedo10gR3/lib/libwsc.so
#4560 <signal handler called>
#4561 0x00002ac2747d9abb in write () from /lib64/libpthread.so.0
#4562 0x000000000040a79e in CServerSocket::SendToSocket (this=0x5379f8, pNode=0x538070)
    at /home/icd/test/testprogram/ServerSocket.cpp:811
#4563 0x000000000040acbf in CServerSocket::SendRecvThread (this=0x5379f
    at /home/icd/test/testprogram/ServerSocket.cpp:664
#4564 0x000000000040ad6f in CServerSocket::SendRecvThread (lparam=0x5379f
    at /home/icd/test/testprogram/ServerSocket.cpp:454
#4565 0x00002ac2747d32a3 in start_thread () from /lib64/libpthread.so.0
#4566 0x00002ac275c5342d in clone () from /lib64/libc.so.6
#4567 0x0000000000000000 in ?? ()
(gdb) f 4564
#4564 0x000000000040ad6f in CServerSocket::SendRecvThread (lparam=0x5379f
    at /home/icd/test/testprogram/ServerSocket.cpp:454
454         ((CServerSocket *)lparam)->SendRecvThread();
(gdb) f 4563
#4563 0x000000000040acbf in CServerSocket::SendRecvThread (this=0x5379f
    at /home/icd/test/testprogram/ServerSocket.cpp:664
664                                     nRetSend = SendToSocket(pNode);
(gdb) p nRetSend
$1 = 0
(gdb) f 4562
#4562 0x000000000040a79e in CServerSocket::SendToSocket (this=0x5379f8, pNode=0x538070)
    at /home/icd/test/testprogram/ServerSocket.cpp:811
811                     int iRet = send(pNode->m_SocketID, pNode->m_pSendBuf, pNode->m_dwSendBufUsed, MSG_NOSIGNAL);
(gdb) p iRet
$2 = 0
(gdb) p pNode->m_SocketID
$3 = 5
(gdb) p pNode->m_pSendBuf
$4 = 0x2aaaaaaab010 "674     "
(gdb) p pNode->m_dwSendBufUsed
$5 = 674
(gdb)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP