3 Stimmen

C++ Backtrace mit this=0x0 in verschiedenen Frames

Ich habe ein Programm in einem Mips-Multicore-System und ich bekomme eine Rückverfolgung von Kern wirklich schwer herauszufinden (zumindest für mich), ich vermute, dass vielleicht einer der anderen Kerne schreiben, um mem aber nicht alle der Stapel beschädigt ist, was es mehr verwirrend für mich macht.

In Frame #2 ist dies NULL und in Frame #0 ist dies ebenfalls NULL (die Ursache des Core-Dumps).

Dies ist (teilweise) die Rückverfolgung:

#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

Über die Funktion 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);

0 Stimmen

Könnten Sie den Code für E::m ?

0 Stimmen

Dieser Code ist einfach, nur bei init wird versucht, ein Mitglied zu überprüfen: int i; bool evaluating=true; if(member_) { .... }

0 Stimmen

Der Kern passiert bei der <pre> 'if(member_)' </pre>

6voto

Josh Kelley Punkte 52169

this=0x0 kann eigentlich ziemlich leicht passieren. Zum Beispiel:

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

this wird NULL sein innerhalb method .

Es besteht kein Grund zur Annahme, dass der Speicher beschädigt oder der Stapel überschrieben wurde. Wenn der restliche Inhalt des Stapels einen Sinn ergibt (und das scheint der Fall zu sein), ist der Stapel wahrscheinlich in Ordnung.

Anstatt unbedingt nach einer Speicherbeschädigung zu suchen, sollten Sie Ihre Logik daraufhin überprüfen, ob Sie einen nicht initialisierten (NULL) Zeiger oder Verweis haben.

1voto

Brady Punkte 10049

Da ich den gesamten Code nicht sehen kann, ist es etwas schwierig, sich vorzustellen, was passiert. Könnten Sie auch den Code für M::e() und P::e() oder zumindest die wichtigen Teile hinzufügen.

Etwas, das alles lösen könnte, ist das Hinzufügen einer NULL-Prüfung wie folgt in 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);

Si p NULL waren, hätte ich erwartet, dass der Aufruf von p->needMore() aber je nachdem, was diese Methode tut, stürzt sie möglicherweise nicht ab.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X