2012-04-25 103 views
1

我在一個mips多核系統中有一個程序,我從內核得到的回溯真的很難弄清楚(至少對我來說),我想也許其中一個內核寫到mem,但並不是所有的堆棧都被損壞了,這讓我對它更加困惑。C++ backtrace with this = 0x0 in various frames

在幀#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 ::發現功能

 

    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); 

+0

你可以包含'E :: m'的代碼嗎? – user7116 2012-04-25 14:33:19

+0

這段代碼很簡單,只是在初始化時,一個成員正試圖進行檢查: int i; bool評估= true; 如果(member_){ .... } – ramp 2012-04-25 14:46:07

+0

芯發生在

 'if(member_)' 
ramp 2012-04-25 14:53:44

回答

4

this=0x0實際上可以很容易地發生。例如:

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

this將內method是NULL。

有沒有必要假設內存已損壞或堆棧已被覆蓋。事實上,如果堆棧內容的其餘部分似乎有意義(並且您似乎認爲它們的確如此),那麼堆棧可能沒問題。

而不一定尋找內存損壞,檢查你的邏輯,看看你是否有一個未初始化(NULL)的指針或引用。

+0

是的,如果只有一幀backtrace有this = 0x0,但在這種情況下兩個'this'指針有一個NULL值,所以這不是將'this'賦值爲NULL的問題。 – ramp 2012-05-03 08:29:59

+0

@ramp - 根據M :: e的實現,它可能能夠在觸發自己的this指針爲NULL的核心轉儲之前成功調用其他函數。然而,從看你的'm :: find'實現,我認爲你可能是正確的,它不是通過NULL指針調用方法的簡單情況。不過,我不確定是什麼問題。 – 2012-05-03 12:59:45

0

無法看到所有代碼,它的類型 - 很難想象發生了什麼。你還可以添加M :: e()和P :: e()的代碼或者至少是重要的部分。

東西可能只是解決一切問題是添加一個空檢查,比如M如下:: find()方法:

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(),但取決於該方法的功能,它可能不會崩潰。

+0

嗨布雷迪, 這裏的問題是指針已經在for循環中檢查,甚至是一個局部變量,所以沒有其他線程可能的副作用,... – ramp 2012-05-07 09:24:43

+0

@ramp,啊對,我沒有捕捉到。 – Brady 2012-05-07 09:27:20