免费注册 查看新帖 |

Chinaunix

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

高难度问题求教。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-09-18 21:06 |只看该作者 |倒序浏览
程序开发环境:
硬件环境:Ultra 6(多CPU),SPARC芯片
操作系统:SUN OS 5.8(Solaris 2.
编译工具:gcc 2.95.2
使用库:STL

问题:
程序经常CORE DUMP,且使用gdb打印信息如下(大部分情况都是这样的):
#0 0xff1c2924 in t_splay () from lib/libc.so.1
(gdb) where
#0 0xff1c2924 in t_splay () from /usr/lib/libc.so.1
#1 0xff1c2924 in t_delete () from /usr/lib/libc.so.1
#2 0xff1c23c4 in realfree () from /usr/lib/libc.so.1
#3 0xff1c2c68 in cleanfree () from /usr/lib/libc.so.1
#4 0xff1c2c68 in _malloc_unlocked () from /usr/lib/libc.so.1
#5 0xff1c1d9c in malloc() from /usr/lib/libc.so.1
#6 0x531e4 in __malloc_alloc_template<0>;::allocate (__n=32) at stl/stl_alloc.h:158

说明:
1、在多CPU(CPU个数大于1)情况下,这个问题经常出现;如果在单CPU环境下,该问题比较少见;
2、如果在编译的时候在Makefile文件中加入__USE_MALLOC,则不会出现CORE DUMP,则转变为程序访问list或者vector时的死循环;
3、写一个测试程序的时候,直接执行程序(不通过后台运行),则当CORE DUMP发生的时候,显示:Bus Error,而不是Seg Error;且在多CPU环境下发生频率最高,单CPU情况下几乎见不了几次发生这个问题;
4、曾经怀疑是由于重复释放list节点导致,可是找不到证据。

如果你遇到过这个问题,且有处理该问题的经验,请你回复。多谢!

论坛徽章:
0
2 [报告]
发表于 2003-09-19 17:30 |只看该作者

高难度问题求教。

是不是多线程操作全局变量或者共享内存的应用程序,说说你的程序的大体设计思路!

论坛徽章:
0
3 [报告]
发表于 2003-09-19 18:35 |只看该作者

高难度问题求教。

PPPPP;
          2、如果在编译的时候在Makefile文件中加入__USE_MALLOC,则不会出现CORE DUMP,则转变为程序访问list或者vector时的死循环;
3、写一个测试程序的时候,直接执行程序(不通过后台运行),则当CORE DUMP发生的时候,显示:Bus Error,而不是Seg Error;且在多CPU环境下发生频率最高,单CPU情况下几乎见不了几次发生这个问题;


//////////////////////////////////////////////////////////////////////////
前几天我用list时也出现过dump的问题,不知道和不和你一样
不过解决了,是我删除节点时出错。删除时有返回一定要付个一个变量

一定要i =list.erase(i);
刚开始我,没注意没付,就出现了dump或者就是死循环

论坛徽章:
0
4 [报告]
发表于 2003-09-19 22:47 |只看该作者

高难度问题求教。

1、大体思路:程序有多个模块,不过每个模块是一个线程。各个模块通过公共模块加载和管理,公共模块是主程序,各个模块写在SO文件中。

2、这个朋友的有一些和我的类似。
源:
//////////////////////////////////////////////////////////////////////////
前几天我用list时也出现过dump的问题,不知道和不和你一样
不过解决了,是我删除节点时出错。删除时有返回一定要付个一个变量

一定要i =list.erase(i);
刚开始我,没注意没付,就出现了dump或者就是死循环

问:为什么一定要“i =list.erase(i); ”呢?有没有一个合理的解释?
严重感激!!!!!!!!

论坛徽章:
0
5 [报告]
发表于 2003-09-20 16:07 |只看该作者

高难度问题求教。

看一下list.erase() 是有返回值的啊,假如你删了不付给i,链表不就脱节了,就象中间截掉一段后,后面的不接上前面的怎么行呢

论坛徽章:
0
6 [报告]
发表于 2003-09-21 12:39 |只看该作者

高难度问题求教。

我们使用的是叠代器,所以不存在这个问题。
相关代码如下:
    List::iterator ListIter = List.begin();
    List::iterator ListEnd = List.end();

    while(ListIter != ListEnd)
    {
        Obj *pObj = *ListIter;
        if(pObj->;id == convalue)
        {
            List.erase(ListIter);   
            break;
        }
        ListIter++;
    }

论坛徽章:
0
7 [报告]
发表于 2003-09-21 14:42 |只看该作者

高难度问题求教。

list::iterator i =mylist.begin();
while(i!=mylist.end())
{
if((*i)->;id == convale)
{
i = mylist.erase(i);
break;
}
i++;
}
还有你的list 是什么结构的放的是什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP