3

私はmipsマルチコアシステムにプログラムを持っており、コアからバックトレースを取得するのは非常に困難です(少なくとも私にとっては)、おそらく他のコアの1つが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) 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 A::trigger の 0x0000000010597364 (this=0x4431fd70, triggerType=ONE, string=0x562f148 "", size=0, up=true) at A.cc:2084
#5 A::findOne の 0x000000001059bcf0 (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 A::shouldpath の 0x00000000105a385c (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 オフセット = 値 - engine_->getData();  
    450 451 int ret=UNKNOWN;            
    452M*p;                    
    453 for(const void* match=it.next();
    454 ret == UNKNOWN && match != NULL;                                                 
    455 一致 = it.next()){
    456 p = (M*) マッチ;   
    457 if(p->needMore()){            
    458 ret = p->e(id_, getIndex(), 値, len, hClass, fHClass, オフセット);

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

NULL の場合p、 の呼び出しでクラッシュしたと予想していましたがp->needMore()、そのメソッドの動作によっては、クラッシュしない場合があります。

于 2012-05-04T13:34:45.473 に答える