C ++回溯在各种帧中使用此= 0x0

时间:2012-04-25 14:30:27

标签: c++ mips

我在mips多核系统中有一个程序,我从核心得到一个回溯真的很难弄清楚(至少对我而言),我想可能其中一个核心写入mem但不是所有堆栈都已损坏是什么让我更加困惑。

在第2帧中,这是NULL,在帧#0中,这也是NULL(核心转储的原因)。

这是(部分)回溯:

#0  E::m (this=0x0, string=0x562f148 "", size=202) at E.cc:315
#1  0x00000000105c773c in P::e (this=0x361ecd00, string=0x562f148 "", size=202, offset=28) at P.cc:137
#2  0x00000000105c8c5c in M::e (this=0x0, id=7 '\a', r=2, string=0x562f148 "", size=202, oneClass=0x562f148 "", secondClass=0x14eff439 "", 
offset=28) at M.cc:75                                         
#3  0x0000000010596354 in m::find (this=0x4431fd70, string=0x562f148 "", size=202, oneClass=0x14eff438 "", secondClass=0x14eff439 "", 
                   up=false) at A.cc:458                    
#4  0x0000000010597364 in A::trigger (this=0x4431fd70, triggerType=ONE, string=0x562f148 "", size=0, up=true) at A.cc:2084
#5  0x000000001059bcf0 in A::findOne (this=0x4431fd70, index=2, budget=0x562f148 "", size=202, up=true) at A.cc:1155
#6  0x000000001059c934 in A::shouldpathNow (this=0x4431fd70, index=2, budget=0x562f148 "", size=202, up=false, startAt=0x0, short=)
   at A.cc:783    
#7  0x00000000105a385c in A::shouldpath (this=0x4431fd70, index=2, rbudget=, rsize=, up=false,
                   direct=) at A.cc:1104

关于m :: find函数


    442 m_t m::find(unsigned char const *string, unsigned int size,
    443                                           hClass_t *hClass, h_t *fHClass,
    444                                           bool isUp) {  
    445   
    446                                                                            
    447   const Iterator &it=arr_[getIndex()]->getSearchIterator((char const*)value, len);
    448                                                            
    449   unsigned int const offset = value - engine_->getData();  
    450                                                                                        451   int ret=UNKNOWN;            
    452   M *p;                    
    453   for(const void* match=it.next(); 
    454       ret == UNKNOWN && match != NULL;                                                 
    455       match = it.next()){ 
    456     p = (M*)match;   
    457 if(p->needMore()){            
    458       ret = p->e(id_, getIndex(), value, len, hClass, fHClass, offset);

2 个答案:

答案 0 :(得分:4)

this=0x0实际上很容易发生。例如:

E *instance = NULL;
instance->method();

thismethod内将为NULL。

没有必要假设内存已损坏或堆栈已被覆盖。事实上,如果堆栈内容的其余部分似乎有意义(并且您似乎认为它们确实存在),那么堆栈可能就好了。

不必查找内存损坏,请检查逻辑以查看是否有未初始化(NULL)指针或引用。

答案 1 :(得分:0)

无法看到所有代码,很难想象发生了什么。你能不能添加M :: e()和P :: e()的代码,或者至少是重要的部分。

可能解决所有问题的方法是在m :: find()中添加NULL检查,如下所示:

456     p = (M*)match;   
        if(!p) { return; /* or do whatever */ }
457     if(p->needMore()){            
458       ret = p->e(id_, getIndex(), value, len, hClass, fHClass, offset);

如果p为NULL,我原以为它会崩溃调用p->needMore(),但是根据该方法的作用,它可能不会崩溃。