免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4788 | 回复: 10
打印 上一主题 下一主题

[C++] gdb可以,直接执行就错误,该怎么做 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-09 17:06 |只看该作者 |倒序浏览
本帖最后由 zhangruichao88 于 2015-01-09 17:50 编辑

有一个线程池的程序,用gdb执行的时候是正确的,但直接执行会出错,如果使用gdb附着进程继续执行,也是正确的,我该怎么解决啊,请各位大神出山


/**********************************************************
*        函数        :        myFunc                                                                       *
*        功能        :        数据处理                                              *
*        输入        :                                                                                          *
*        输出        :                                                                                          *
*        返回        :                                                                                          *
*        说明        :                                                                                  *
***********************************************************/

void myFunc(void * const arg)
{
        printf("myFunc arg = %p\n", arg);
        //if(arg == NULL)
        //        return;
        bool RevComplete = false;        //数据接收完成的标识
        struct timespec time_out;
        memset(&time_out, 0, sizeof(time_out));
        time_out.tv_sec = time(0);// + 60;        //60s
        time_out.tv_nsec = IDLE_SCAN_PERIOD * 10 * 1000 * 1000;  //100ms
       
    pthread_mutex_lock(&m_Mutex);

        //AppMend *AppModule = (AppMend *)malloc(sizeof(AppMend));
        //memcpy(AppModule, (AppMend*)arg, sizeof(AppMend));
        AppMend *AppModule = (AppMend *)arg;

        /*if(arg != NULL)
        {
                free(arg);       
                arg = NULL;
        }*/
       
    pthread_mutex_unlock(&m_Mutex);

        u_int FlowID = AppModule->GetFlowId();       
        pthread_mutex_lock(&m_pthreadMap);
        if(flow2pid.find(FlowID) == flow2pid.end())
        {
                flow2pid.insert(map<u_int, pthread_t>::value_type(FlowID, pthread_self()));
        }       
        pthread_mutex_unlock(&m_pthreadMap);

        //std::cout << "CreateTask FlowID = " << FlowID << ", flow2pid[FlowID] = "
        //        << flow2pid[FlowID] << ", pid = " << pthread_self() << std::endl;       

        //等待信号
        while(1)
        {       
                printf("arg = %p\n", arg);
                int rc = 0;                       
                siginfo_t myinfo;
               
                //组包并排序
                if(!RevComplete)
                {
                        AppModule->DataSort(false);
                }
                else
                {
                        AppModule->DataSort(true);
                        break;
                }
                               
                sigset_t oldmask;                       
                /*
                if(sigprocmask(SIG_BLOCK, &set, &oldmask) < 0)                          
                {                                 
                        fprintf(stderr, "SIG_BLOCK error/n";
                        continue;
                }
                */
               
                rc = sigtimedwait(&set, &myinfo, &time_out);
                if(rc == -1)
                {
                        printf("sorry thread time out !\n";
                        //std::cout << "sorry thread[" << pthread_self() << "] time out !" << std::endl;
                        RevComplete = true;        //超时发送数据接收的标识
                        continue;
                }

                //if(AppModule == NULL)
                //        AppModule = (AppMend *)malloc(sizeof(AppMend));
               
                if(AppModule != NULL)
                {
                        memset(AppModule, 0, sizeof(AppMend));
                        if(!pthread_recv(AppModule))
                        {
                                cout << "Share Memory error !\n";                               
                                RevComplete = true; //共享内存为空发送数据接收的标识
                                continue;
                        }                       
                }
               
                //std::cout << "pthread_recv FlowID = " << AppModule->GetFlowId() << ", flow2pid[FlowID] = "
                //        << flow2pid[AppModule->GetFlowId()] << ", pid = " << pthread_self() << std::endl;

        }
        if(AppModule != NULL)
        {
                free(AppModule);
                //AppModule = NULL;                       
        }

        pthread_mutex_lock(&m_pthreadMap);
        //解除相应map
        for(map<u_int, pthread_t>::iterator iter1 = flow2pid.begin(); iter1 != flow2pid.end()
        {
                if(iter1->first == FlowID)
                {
                        //std::cout << "free FlowID = " << FlowID << ", flow2pid[FlowID] = " << flow2pid[FlowID] << std::endl;
                        flow2pid.erase(iter1++);
                }
                else
                        ++iter1;
        }
        pthread_mutex_unlock(&m_pthreadMap);
}

在打印while循环下的arg时,会提示printf出错,如果删除该行,则会提示User defined signal 1 后程序终止

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
2 [报告]
发表于 2015-01-09 17:24 |只看该作者
通常是内存类错误,打日志吧。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2015-01-09 17:30 |只看该作者
具体什么错?有可能是执行时序不一样导致不同的结果

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
4 [报告]
发表于 2015-01-09 17:30 |只看该作者
具体什么错?有可能是执行时序不一样导致不同的结果

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
5 [报告]
发表于 2015-01-09 17:39 |只看该作者
确实应该是内存错误,当我打印地址的时候,会崩溃,printf崩溃。
回复 2# zhaohongjian000


   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
6 [报告]
发表于 2015-01-09 17:40 |只看该作者
现在只知道内存改变了,但怎么引起的并不知道啊。
hellioncu 发表于 2015-01-09 17:30
具体什么错?有可能是执行时序不一样导致不同的结果

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
7 [报告]
发表于 2015-01-09 17:44 |只看该作者
把代码贴出一部分吧,请大神帮忙看看
回复 4# hellioncu


   

论坛徽章:
0
8 [报告]
发表于 2015-01-20 17:32 |只看该作者
可能和同步有关,打日志&静态分析吧。

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2015-01-21 10:19 |只看该作者
让它吐核吧,再在gdb里面看

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
10 [报告]
发表于 2015-01-21 14:25 |只看该作者
俺写过一个多线程的server,有十分十分十分十分小的概率出现死锁问题,只出现过一次,被我发现了,于是一直铭记在心,肯定有bug。
在然后,无论怎么执行都在没有发现死锁,但,不能这样将bug放过。

于是,gdb,发现,有非常大的概率发现死锁问题。后来我hold住所有线程(忘记是什么gdb命令了),然后一步一步的step当前线程,一个一个线程的试验,发现某个线程先执行,必然导致死锁,因此结论是:
gdb干预了操作系统对线程的调度。

因此,楼主的问题,只能去gdb慢慢看代码了,看看是不是某个线程先执行,必然导致错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP