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)
.
Bitte markieren Sie mit der Programmiersprache. – JJJ