CSDN上高手多,帮忙求解,Segmentation fault in unnamed block问题,谢谢

dnboy 2008-05-09 10:57:19
我定义了一个hashtable模板类,然后实例化了多个不同的hashtable (假设A、B、C、D),为A、B、C、D各自创建了一个实例a,b,c,d然后调用hashtable模板类中的buildIndex方法创建索引,其中a、c可以创建,但是b,c会core,core信息为:
p570a:/ztesoft/media/src/mediation/pretreat >dbx pretreatTest core
Type 'help' for help.
[using memory image in core]
reading symbolic information ...warning: pretreatTest.cpp is newer than pretreatTest


Segmentation fault in unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,p
retreat::Add_Field_Cfg_Compare>::BuildIndex(unsigned char) at line 162 in file "mi_hash.h" ($t1)
162 m_ucMaxIndexCount = ucHashMethod+1;
(dbx) where
unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,pretreat::Add_Field_Cfg
_Compare>::BuildIndex(unsigned char)(this = 0x0000000000000001, ucHashMethod = '^A'), line 162 in "mi_hash.h"
mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,pretreat::Add_Field_Cfg_Compare>::BuildI
ndex(unsigned char)(this = 0x0000000000000001, ucHashMethod = '^A'), line 162 in "mi_hash.h"
TPretreatEngine::ReLoadData()(this = 0x000000011014f750), line 201 in "pretreat.cpp"
TPretreatEngine::Init()(this = 0x000000011014f750), line 287 in "pretreat.cpp"
TPretreatEngine::Initialize()(this = 0x000000011014f750), line 449 in "pretreat.cpp"
TAppPretreat::InitService(int,char**)(this = 0x000000011000fbf0, argc = 3, argv = 0x0ffffffffffffad0), line 164 in "TApp
Pretreat.cpp"
unnamed block in pretreatTest.main(0x300000003, 0xffffffffffffad0), line 27 in "pretreatTest.cpp"
pretreatTest.main(0x300000003, 0xffffffffffffad0), line 27 in "pretreatTest.cpp"
(dbx)

创建索引的模板为:
//创建一个索引
int BuildIndex(unsigned char ucHashMethod)
{
int iRet = MIHASH_SUCCESS;

if(ucHashMethod == 0xff)
{
return MIHASH_HASH_METHOD_TOO_LARGE;
}

if(ucHashMethod >= m_ucMaxIndexCount)
{
CHashIndex** ppHashIndex = (CHashIndex**)malloc(sizeof(CHashIndex**)*(ucHashMethod+1));
if(NULL == ppHashIndex)
{
return MIHASH_MEMEORY_ALLOC_FAILED;
}

memset(ppHashIndex,0,sizeof(CHashIndex**)*(ucHashMethod+1));

if(NULL != m_ppHashIndex)
{
memcpy(ppHashIndex,m_ppHashIndex,sizeof(CHashIndex**)*m_ucMaxIndexCount);
free(m_ppHashIndex);
}

m_ucMaxIndexCount = ucHashMethod+1; //core 在这行m_ucMaxIndexCount为unsigned char类型,此时的值为0,ucHashMethod的值为1,也是unsigned char
m_ppHashIndex = ppHashIndex;
}
else
{
if(NULL != m_ppHashIndex[ucHashMethod])
{
return MIHASH_INDEX_HAS_EXISTED;
}
}
**********//省略
};

这是在IBM AIX5.3机器上运行会core(64位机器),但是在我的windows上面(32位)运行就没有问题
而且在AIX上面表现出来是部分hashtable有问题部分没有问题(程序中有多个hashtable)
请问是怎么回事呢?
...全文
823 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dnboy 2008-05-09
  • 打赏
  • 举报
回复
刚才一步一步的调试了,确实是core在m_ucMaxIndexCount = ucHashMethod+1;很奇怪

给大家看看调试过程:sizeof没有报错
(dbx) step
stopped in unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,pretreat::Ad
d_Field_Cfg_Compare>::BuildIndex(unsigned char) at line 148 in file "mi_hash.h" ($t1)
148 CHashIndex** ppHashIndex = (CHashIndex**)malloc(sizeof(CHashIndex**)*(ucHashMethod+1));(dbx) p (int)m_ucMaxIndexCount
0
(dbx) p ppHashIndex
0x0000000000000009
(dbx) p *ppHashIndex
(nil)
(dbx) step
stopped in unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,pretreat::Ad
d_Field_Cfg_Compare>::BuildIndex(unsigned char) at line 149 in file "mi_hash.h" ($t1)
149 if(NULL == ppHashIndex)
(dbx) step
stopped in unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,pretreat::Ad
d_Field_Cfg_Compare>::BuildIndex(unsigned char) at line 154 in file "mi_hash.h" ($t1)
154 memset(ppHashIndex,0,sizeof(CHashIndex**)*(ucHashMethod+1));
(dbx) p sizeof(ppHashIndex)
8
(dbx) step
stopped in AppCommon.memset(void*,int,unsigned long) at line 133 in file "/usr/vacpp/include/string.h" ($t1)
133 { return __memset (__s, __c, __n); }
(dbx) step
stopped in AppCommon.memset(void*,int,unsigned long) at line 133 in file "/usr/vacpp/include/string.h" ($t1)
133 { return __memset (__s, __c, __n); }
(dbx) step
stopped in unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,pretreat::Ad
d_Field_Cfg_Compare>::BuildIndex(unsigned char) at line 156 in file "mi_hash.h" ($t1)
156 if(NULL != m_ppHashIndex)
(dbx) step
stopped in unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,pretreat::Ad
d_Field_Cfg_Compare>::BuildIndex(unsigned char) at line 156 in file "mi_hash.h" ($t1)
156 if(NULL != m_ppHashIndex)
(dbx) step
stopped in unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,pretreat::Ad
d_Field_Cfg_Compare>::BuildIndex(unsigned char) at line 162 in file "mi_hash.h" ($t1)
162 m_ucMaxIndexCount = ucHashMethod+1;
(dbx) p m_ucMaxIndexCount
'\0'
(dbx) p ucHashMethod
'^A'
(dbx) set ucHashMethod = 1
"ucHashMethod" is a program symbol -- use assign
(dbx) assign ucHashMethod=1
(dbx) p ucHashMethod
'^A'
(dbx) step

Segmentation fault in unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,p
retreat::Add_Field_Cfg_Compare>::BuildIndex(unsigned char) at line 162 in file "mi_hash.h" ($t1)
162 m_ucMaxIndexCount = ucHashMethod+1;
(dbx) p &m_ucMaxIndexCount
0x0000000000000085
(dbx) step

Segmentation fault in unnamed block in mi_hash::CHashTab<pretreat::Table_Add_Field_Cfg,pretreat::Add_Field_Cfg_HashKey,p
retreat::Add_Field_Cfg_Compare>::BuildIndex(unsigned char) at line 162 in file "mi_hash.h" ($t1)
162 m_ucMaxIndexCount = ucHashMethod+1;
(dbx) step
hai040 2008-05-09
  • 打赏
  • 举报
回复
如果是sizeof的问题,那为何程序报错是m_ppHashIndex = ppHashIndex;行,这行又没有sizeof

------
Segmentation fault错的通常不是报错的地方
而是之前的内存操作错误
xkyx_cn 2008-05-09
  • 打赏
  • 举报
回复
所以建议你通过调试重现问题,才能找出确切原因
dnboy 2008-05-09
  • 打赏
  • 举报
回复
因为程序运行的平台还不能确定,而且各个平台的hash也不一定是一样的,所以才自己定义了一个hash
dnboy 2008-05-09
  • 打赏
  • 举报
回复
能说详细点么,看不出来哪里越界,m_ucMaxIndexCount 是其子类的成员,父类访问子类的成员应该是可以的啊,怎么会越界呢?
如果是sizeof的问题,那为何程序报错是m_ppHashIndex = ppHashIndex;行,这行又没有sizeof

而sizeof(CHashIndex**)*(ucHashMethod+1)中,sizeof(CHashIndex**)是一个指针的大小,应该不大的,ucHashMethod是一个无符号字符1,两个相乘,得到的数也不大,分配这么小的内存不会有问题的

另外,如果说是这些问题,那为什么只是部分的hashtable会这样,而一部分的又不会这样呢?
taodm 2008-05-09
  • 打赏
  • 举报
回复
大部分C++编译器里都带了现成的hash的,先考虑用现成的。
xkyx_cn 2008-05-09
  • 打赏
  • 举报
回复
内存操作越界了, 仔细检查程序, 调试定位问题出在哪儿
我觉得sizeof比较可疑
hai040 2008-05-09
  • 打赏
  • 举报
回复
刚才一步一步的调试了,确实是core在m_ucMaxIndexCount = ucHashMethod+1;很奇怪

[Quote=引用 6 楼 hai040 的回复:]
如果是sizeof的问题,那为何程序报错是m_ppHashIndex = ppHashIndex;行,这行又没有sizeof

------
Segmentation fault错的通常不是报错的地方
而是之前的内存操作错误
[/Quote]

举个例子
int *p,g[10];
写g越界了,更改了p的值,然后再做了其它事
再运行到用了p的语句,这时就很可能会报Segmentation fault
出错的语句没错,错的是g的越界
所以找Segmentation fault的原因要注意出错语句之前的内存操作

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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