2012-04-25 17 views
1

私はmipsマルチコアシステムにプログラムを持っており、コアからのバックトレースを得ることは本当に難しいです(少なくとも私にとっては)、他のコアの1つがすべてのスタックが壊れているわけではありません。さまざまなフレームでthis = 0x0のC++バックトレース

フレーム#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 

::見つける

 

    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

+0

このコードは簡単です。メンバーがチェックされようとしているだけです。 int i; bool evaluationating = true; { ....}(member_)場合 – ramp

+0

コア – ramp

答えて

4

this=0x0が、実際にはかなり簡単に起こることができる機能:

これは、バックトレース(一部)です。たとえば:

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

thismethod内でNULLになります。

メモリが破損しているか、スタックが上書きされたとみなす必要はありません。実際には、残りのスタックの内容が意味をなさないようであれば、そのスタックはおそらく大丈夫です。

メモリ破損を必ず見つけ出す代わりに、ロジックをチェックして、初期化されていない(NULL)ポインタまたは参照があるかどうかを確認してください。

+0

はい、これは、バックトレースの1つのフレームだけが0x0を持っていた場合に意味がありますが、この場合は2つの 'this'ポインタにNULL値がありますので、 'this'にNULLを代入するのは問題ではありません。 – ramp

+0

@ramp - M :: eの実装によっては、自身の 'this'ポインタからのコアダンプをNULLにする前に他の関数を正常に呼び出すことができます。しかし、あなたの 'm :: find'実装を見ると、NULLポインタを使ってメソッドを呼び出すのは簡単なことではないでしょう。しかし、私は問題が何であるか分かりません。 –

0

すべてのコードを見ることができず、何が起きているのか想像するのは難しいです。 M :: e()とP :: e()のコードを追加したり、少なくとも重要な部分を追加したりできますか?ただすべてがメートルで、次のように、NULLチェックを追加することで解決するかもしれません

サムシング::()を見つける:pが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->needMore()を呼び出してクラッシュしたと予想しているだろうその方法が何であるかによって、クラッシュすることはありません。

+0

こんにちはBrady、 ここでの問題は、forループでポインタがチェックされていて、ローカル変数であっても他のスレッドで副作用が発生しないということです。 – ramp

+0

@ramp、ああ、私はそれをキャッチしませんでした。 – Brady

関連する問題