免费注册 查看新帖 |

Chinaunix

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

[C] 64bit OS 调用 隐式声明函数 的 返回值导致程序崩溃 [已解决] [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
11 [报告]
发表于 2013-03-24 16:58 |只看该作者
txgc_wm 发表于 2013-03-24 16:10
楼主,是否可以直接上code?  看楼主这样一步步的分析,大伙也了解不了多少,只能靠臆断。


征求了BOSS的意见
不允许贴上所有代码
见谅

不管怎么样,还是谢谢~!

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
12 [报告]
发表于 2013-03-24 17:01 |只看该作者
本帖最后由 robin10 于 2013-03-24 17:01 编辑

做了几个实验:
1.在主程序编译的时候加 -pthread.
结论:一样出现seg fault.

2. 在主程序和其他库 编译的时候加 -pthread.
结论:一样出现seg fault.

3. 添加 -pthreads
结论:系统不支持改参数。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
13 [报告]
发表于 2013-03-25 09:10 |只看该作者
malloc和free内部有锁,不会是它们的问题。
既然你这个是多线程,你是否可以保证正在free的时候,没有其他线程也正在访问这段数据?
另外你是否可以保证,free之后,没有其他线程将访问这段数据?(因为在一些模型中,一个线程负责生成事件并放入事件队列,另一个线程负责处理事件队列,而内存被free后,相关事件却还在队列中,等它被取出处理时就挂了)
多线程需要多方位的思考之间的先后关系,确实是比较容易出错的,如果经验不足而且应用范围小,可以不使用多线程实现的尽量不要使用之。

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
14 [报告]
发表于 2013-03-25 09:15 |只看该作者
malloc/free都有自己的内部锁,不会有问题。

>> #cp_msg_node_data#463 0xffffffff90032f70 0x923950  //传递到下一个函数的指针值

从corruption pattern 来看有可能指针本身被破坏了,可以检查下第一个函数的local variables是不是
初始化了,是不是有memory overrun.

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
15 [报告]
发表于 2013-03-25 09:19 |只看该作者
还有64位的问题注意中间有没有32-64转换过程破坏了指针

论坛徽章:
1
白羊座
日期:2013-08-20 17:40:23
16 [报告]
发表于 2013-03-25 10:05 |只看该作者
曾经遇到过,多线程malloc,free问题,每次core的都不一样,
结果是有地方越界了,破坏了malloc的链式结构,lz看看可不可
能是这样吧

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
17 [报告]
发表于 2013-03-25 12:19 |只看该作者
static void cp_msg_list( struct DOUBLE_LIST_IDX* list_idx, struct MSG_INFO* header)
{

int ret;
int count = 0;
struct MSG_INFO* pMsg_tmp;
struct MSG_INFO* pMsg_node;
struct MSG_INFO* pMsg_next;
struct MSG_INFO* pMsg_header = NULL;

Dprintf("#%s#%d\n", __FUNCTION__, __LINE__);
if(list_idx == NULL || header == NULL) {
    return;
}

    pMsg_next = header;
    while(pMsg_next != NULL) {

            pMsg_node = found_bakup_msg_node();
            if(pMsg_node != NULL) {
                    Dprintf("#%s#%d\n", __FUNCTION__, __LINE__);
                    ret = cp_msg_node_data(pMsg_node, pMsg_next);
                    Dprintf("#%s#%d\n", __FUNCTION__, __LINE__);
                    if(ret == TRUE) {
                            //add_node_to_list()
                    }
            }

            count ++;
            pMsg_next = pMsg_next->next;
    }
    pMsg_tmp->next = NULL;

    return ;
}

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
18 [报告]
发表于 2013-03-25 13:08 |只看该作者
本帖最后由 robin10 于 2013-03-26 05:52 编辑
w_anthony 发表于 2013-03-25 09:10
malloc和free内部有锁,不会是它们的问题。
既然你这个是多线程,你是否可以保证正在free的时候,没有其他 ...



既然你这个是多线程,你是否可以保证正在free的时候,没有其他线程也正在访问这段数据?
Robin>>这个应该可以保证,因为线程B负责malloc 生产的数据,会在线程A中才会释放。(上述cp_msg_list_data() 为线程A跑的)


另外你是否可以保证,free之后,没有其他线程将访问这段数据?
Robin>> 逻辑上可以保证。因为只有线程A才会继续访问和释放 B已经生产的数据。


论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
19 [报告]
发表于 2013-03-25 13:11 |只看该作者
irp 发表于 2013-03-25 09:19
还有64位的问题注意中间有没有32-64转换过程破坏了指针


不太可能,起码我自己没有使用这类型的转换。
但是我会认真检查一下代码。
谢谢!

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-06-04 06:20:00
20 [报告]
发表于 2013-03-25 13:12 |只看该作者
cgcym1234 发表于 2013-03-25 10:05
曾经遇到过,多线程malloc,free问题,每次core的都不一样,
结果是有地方越界了,破坏了malloc的链式结构 ...


我也觉得这个可能性比较大。。。
请问怎么样下手?可以详细描述一下吗?
谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP