2017-03-15 23 views
0

Mein Programm wurde beendet, als die Funktion "dbmSetIndex" zurückgegeben wurde. Sie können die getötete Position unten sehen. (=> Teil) Können Sie erklären, was passiert ist? (x86 Intel)Programm wurde beendet, nachdem Funktion zurückgegeben

0x0000000000420723 <+83>: mov rdi,r14 
    0x0000000000420726 <+86>: call 0x405260 <[email protected]> 
    0x000000000042072b <+91>: test eax,eax 
    0x000000000042072d <+93>: mov ebp,eax 
=> 0x000000000042072f <+95>: mov DWORD PTR [r12],eax 
    0x0000000000420733 <+99>: jne 0x4207d0 <FnDBBase::SelectSecurity(s_oms_security*, char*)+256> 
    0x0000000000420739 <+105>: lea rsi,[rip+0x4197d]  # 0x4620bd 

ist die dbmSetIndex Code. Ich kann nicht finden, welcher Teil dieses Codes dieses Problem verursacht hat.

+0

Bitte markieren Sie mit der Programmiersprache. – JJJ

Antwort

1

Sie haben ein wenig Disassembly bereitgestellt, das zeigt, dass der Aufruf der von Ihnen bereitgestellten Funktion bereits zurückgegeben wurde. Der Absturz erfolgte nicht innerhalb der Funktion, aber danach:

Aufruf Ihrer Funktion:

0x0000000000420726 <+86>: call 0x405260 <[email protected]> 

Sie hier zurück schon:

0x000000000042072b <+91>: test eax,eax 

Die kritische Linie ist ein Speicherzugriff auf die im Register r12 gespeicherte Adresse (schreiben):

0x000000000042072f <+95>: mov DWORD PTR [r12],eax 

Lassen Sie Ihren Debugger die Register anzeigen und schauen Sie sich den Inhalt von r12 an. Es ist sehr wahrscheinlich, dass es 0x0000000000000000 oder ein kleiner Wert ist, also ein Nullzeiger (oder NULL-Verweis), aber es könnte auch eine ungültige Adresse enthalten (nicht initialisierter Zeiger!).

Es gibt jedoch wenig mehr zu erzählen von den Informationen, die Sie zur Verfügung stellen. Sie müssen die Code-Position betrachten, in der die Funktion heißt - sie muss innerhalb der Funktion FnDBBase::SelectSecurity(s_oms_security*, char*) sein, weil Sie (jne) zu einem Offset innerhalb dieser Funktion springen ([...] + 256). Es sollte eine if beteiligt sein (test + jne Anweisungen) und wahrscheinlich eine Zeigerzuweisung. Möglicherweise etwas wie folgt aus:

SomeClass* s = [...]; 
s->someMember = dbmSetIndex([...]); // (*) 
if(*s->someMember) 

(*): Failure Lage, Fehler geschah bei der Zuordnung nach die Funktion bereits abgeschlossen. Zähle nicht 100% auf das Finden einer solchen Zuweisung, es könnte auch ein Aufruf einer Inliner-Setzerfunktion sein.

Und hier sehen wir auch, warum R12 nicht unbedingt 0 ist: es würde den vorberechneten Offset von someMember innerhalb SomeClass, d. e. & (s-> someMember) was gut sein könnte, wenn s 0 ist, e. G. 16, 28, ... Genau, der enthaltene Wert ist gleich offsetof(SomeClass, somemember).

Verwandte Themen