3

我在 mips 多核系统中有一个程序,我从核心得到一个回溯真的很难弄清楚(至少对我来说),我想也许其他核心之一写入内存,但并不是所有的堆栈都被破坏是什么造成的对我来说更困惑。

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

这是(部分)回溯:

#0 E::m (this=0x0, string=0x562f148 "", size=202) at E.cc:315
#1 0x00000000105c773c 在 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 "",
偏移量=28) 在 M.cc:75                                         
#3 0x0000000010596354 in m::find (this=0x4431fd70, string=0x562f148 "", size=202, oneClass=0x14eff438 "", secondClass=0x14eff439 "",
                   up=false) 在 A.cc:458                    
#4 0x0000000010597364 在 A::trigger (this=0x4431fd70, triggerType=ONE, string=0x562f148 "", size=0, up=true) at A.cc:2084
#5 0x000000001059bcf0 在 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=)
   在 A.cc:783    
#7 0x00000000105a385c 在 A::shouldpath (this=0x4431fd70, index=2, rbudget=, rsize=, up=false,
                   直接=) 在 A.cc:1104

关于 m::find 函数

    第442章
    第443章
    第444章  
    445   
    446                                                                            
    第447章
    448                                                            
    449 unsigned int const offset = value - engine_->getData();  
    450 451 int ret=未知;            
    452 米*p;                    
    第453章
    454 ret == 未知 && 匹配!= NULL;                                                 
    第455章
    456 p = (M*) 匹配;   
    第457章            
    第458章

4

2 回答 2

6

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

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

this内将为 NULL method

无需假设内存已损坏或堆栈已被覆盖。事实上,如果堆栈的其余内容似乎有意义(并且您似乎认为它们确实如此),那么堆栈可能没问题。

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

于 2012-04-25T15:10:35.873 回答
1

无法查看所有代码,很难想象发生了什么。您是否还可以添加 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(),但根据该方法的作用,它可能不会崩溃。

于 2012-05-04T13:34:45.473 回答