Speicher Korruption Debuggen mit android ndk
Ich bin immer ein segfault in der nativen Teil meiner android-app, die im moment eine void-Funktion gibt an seinen Aufrufer. Um besser visualisieren, habe ich eine log-Anweisung am Ende der aufgerufenen Funktion, und eine, in der Anrufer die Funktion, die direkt nach dem aufrufen der angerufene (sorry für das Wortspiel).
In der logcat, die erste Meldung wird ausgegeben, und die zweite nicht (die app stürzt ab).
Denken über eine mögliche Speicherbeschädigung ich beschlossen, Sie zu aktivieren malloc debug (Angabe "setprop-libc.debug.malloc 10" in der adb shell). Dann, ich bekomme in der logcat direkt nach dem log-Nachricht vom Ende der aufgerufenen Funktion:
D/MyApp - NativeSide(12778): I am the callee function and I am about to return!
E/libc (12778): *** FREE CHECK: buffer 0x82869900 corrupted 16 bytes before allocation
E/libc (12778): call stack:
E/libc (12778): 0: 8000e3ea
E/libc (12778): 1: 8000e49c
E/libc (12778): 2: 8000e4e2
E/libc (12778): 3: 8000e540
E/libc (12778): 4: afd14ccc
E/libc (12778): 5: 81258188
E/libc (12778): 6: 81258188
E/libc (12778): 7: 81258188
E/libc (12778): 8: 81258188
E/libc (12778): 9: 81258188
E/libc (12778): 10: 81258188
E/libc (12778): 11: 81258188
E/libc (12778): 12: 81258188
E/libc (12778): 13: 81258188
E/libc (12778): 14: 81258188
E/libc (12778): 15: 81258188
E/libc (12778): 16: 81258188
E/libc (12778): 17: 81258188
E/libc (12778): 18: 81258188
E/libc (12778): 19: 81258188
Konnte ich nicht finden keine Informationen zum entschlüsseln dieser Ausgabe. Die zahlen in jeder Zeile verändern sich bei jedem app-Start. Ich hoffe es gibt einen Weg, um diese Informationen zu verwenden, wie eine Ahnung, wo die Korruption passiert, als ich nicht finden können, es aus dem code. Auch ich habe versucht, den Bau der nativen Bibliotheken mit "-fstack-check-flag, aber ich könnte nicht sagen, wenn ich mehr Informationen sind im Logbuch (es scheint nicht, aber vielleicht habe ich Sie verpasst), oder ob ich andere Dinge zu tun, um Sie zu bekommen.
Auch hier ist der stack dump, kommt nach dem "GRATIS-CHECK:" Nachricht.
I/DEBUG (12311): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG (12311): Build fingerprint: 'google/soju/crespo:2.3/GRH55/79397:user/release-keys'
I/DEBUG (12311): pid: 12778, tid: 12907 >>> com.ntrack.tuner <<<
I/DEBUG (12311): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
I/DEBUG (12311): r0 deadbaad r1 45ea374c r2 00000027 r3 00000000
I/DEBUG (12311): r4 00000080 r5 45ea374c r6 8003422e r7 45ea37b4
I/DEBUG (12311): r8 45da4000 r9 a811eca5 10 00100000 fp 00000001
I/DEBUG (12311): ip ffffffff sp 45ea3738 lr 8000f623 pc 8000f650 cpsr 20000030
I/DEBUG (12311): d0 3f9664f48406d639 d1 3f8226e3e96e8495
I/DEBUG (12311): d2 3faba1ba1bb34201 d3 0000000000000000
I/DEBUG (12311): d4 3d7943379e56fd24 d5 3d8f940585cd5f95
I/DEBUG (12311): d6 3f2cf2145b888497 d7 3f2cf214636d85f8
I/DEBUG (12311): d8 0000000000000000 d9 0000000000000000
I/DEBUG (12311): d10 0000000000000000 d11 0000000000000000
I/DEBUG (12311): d12 0000000000000000 d13 0000000000000000
I/DEBUG (12311): d14 0000000000000000 d15 0000000000000000
I/DEBUG (12311): scr 20000010
I/DEBUG (12311):
Nichts, ein Vorschlag, auf die typischen Sachen zu kontrollieren oder einfach nur die Art und Weise, um die Verwendung der malloc-debug-Informationen wäre eine große Hilfe, danke!
das wäre viel code 🙂
InformationsquelleAutor athos | 2012-07-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für mich:
bedeutet stack-Korruption (mehr als heap-Beschädigung). In welchem Zustand wird auf dem stack gespeichert werden, diese Funktion, die Sie zurückgeben (und von jeder Funktion, die nennt ..)?
Den Aufruf-stack-Ausgabe, die Sie sehen, sollte die Adresse der einzelnen Funktionen auf dem stack an der Zeit, die Korruption entdeckt wurde. Sie müssen wissen, welche Adresse Sie Ihre Bibliothek wurde geladen, Karte die wieder zu einem symbol in Ihrem
.so
. (Ich denke, diese Frage wird Ihnen helfen: Wie zu verwenden addr2line in Android)Die Tatsache, dass
81258188
wiederholt aus der Spitze des stack dump auch vorschlagen, dass Sie haben könnte ausgeblasen unten im Stapel (durch recursing zu viele Male). Wenn Sie sich nicht bewußt sind, die auf einer vorsätzlichen Rekursion in deinem code, dann herauszufinden, wo Ihre Bibliothek geladen wurde und Zuordnung, die Sie zurück zu Ihrem code, der nützlich sein könnte.InformationsquelleAutor P.T.
Den malloc-debug-Eigenschaft ist wahrscheinlich die Einstellung, die einige Magische zahlen vor und nach dem Bereich, den Sie zuordnen. Dann, wenn die Befreiung, es würde überprüfen Sie diese Bereiche, um sicherzustellen, dass die Magische Zahl ist immer noch da.
Zum Beispiel, wenn Sie allocate 1024 bytes:
Den malloc debug-code würde eigentlich allocate 1024 bytes, die Sie angefordert, plus einige extra, um es:
Die Bibliothek würde dann schreiben Sie einen magischen Wert in diese 32 bytes:
Die Bibliothek zurückkehren würde
0xc0000020
inp
und intern speichern würde0xc0000000
, die Größe, etc.Ihre Funktion wird dann benutzt, den zugewiesenen Bereich irgendwie:
Beachten Sie diese Zeile kopiert mehr als 1024 bytes ist. Das schreiben einer 0 in der Runde der letzten 32 byte Zauberei-Bereich (beachten Sie den
0
in den letzten 32 bytes, die0xdeadd00d
):Wenn Ihre Funktion telefonieren kostenlos:
Die Bibliothek würde dann überprüfen, um sicherzustellen, dass die ersten und die letzten 32 bytes sind immer noch
0xdeadd00d
. Da Ihre Funktion überschrieben haben, die letzten 32 bytes, es würde zu drucken eine Fehlermeldung wie Sie auf dem Laufenden.Dies ist nur ein Beispiel dafür, wie ein malloc debug-Prüfung arbeiten würden. Wenn Sie möchten, um zu sehen, genau das, was die malloc-debug-Prüfungen und wie es funktioniert, gehen Sie auf die
bionic
Verzeichnis von Android-Quelle und suchen Sie nach der Eigenschaft, die Sie festlegen,libc.debug.malloc
.Überprüfen Sie Ihren code für Sie, wie Sie verwenden reservierten Speicher in der Funktion. Sie werden wahrscheinlich schreiben auf einen Bereich außerhalb des Bereichs, der Sie zugeordnet.
InformationsquelleAutor user1493941