Ich ziehe ein Projekt in das neue Android Native Development Kit (d.h. JNI) um und möchte SIGSEGV einfangen, sollte es auftreten (möglicherweise auch SIGILL, SIGABRT, SIGFPE), um einen schönen Absturzberichtsdialog anzuzeigen, anstelle von (oder vor) dem, was derzeit passiert: dem sofortigen unsanften Tod des Prozesses und möglicherweise dem Versuch des Betriebssystems, ihn neu zu starten. (Bearbeitung: Der JVM/Dalvik-VM fängt das Signal ab und protokolliert einen Stack-Trace und andere nützliche Informationen; ich möchte dem Benutzer einfach die Möglichkeit bieten, mir diese Informationen per E-Mail zu senden.)
Die Situation ist die: Ein großer C-Code, den ich nicht geschrieben habe, erledigt den Großteil der Arbeit in dieser Anwendung (alle Spiellogik) und obwohl er auf zahlreichen anderen Plattformen gut getestet ist, ist es durchaus möglich, dass ich bei meiner Android-Portierung Müll an ihn weiterleite und einen Absturz im nativen Code verursache, daher möchte ich die Absturzberichte (sowohl nativ als auch Java), die derzeit im Android-Protokoll auftauchen (ich vermute, es wäre stderr in einer nicht-Android-Situation). Ich bin frei, sowohl den C- als auch den Java-Code beliebig zu ändern, obwohl die Rückrufe (sowohl eingehend als auch ausgehend aus JNI) etwa 40 sind und offensichtlich, Bonuspunkte für kleine Unterschiede.
Ich habe von der Signalkettenbibliothek in J2SE, libjsig.so, gehört und wenn ich einen Signalhandler wie diesen sicher auf Android installieren könnte, würde das das Einfangen des Teils meiner Frage lösen, aber ich sehe keine solche Bibliothek für Android/Dalvik.
0 Stimmen
Wenn Sie die Java-VM durch ein Wrapper-Skript starten können, können Sie überprüfen, ob die App anormale beendet wurde, und die Fehlerberichterstattung durchführen. Dadurch können Sie alle Arten von abnormalen Beendigungen sauber einfangen, sei es SIGSEGV, SIGKILL oder was auch immer. Ich glaube jedoch nicht, dass dies mit Standard-Android-Apps möglich ist, daher wird dies als Kommentar gepostet (konvertiert von Antwort).
0 Stimmen
Auch sehen: Kann ein Java Android-Programm nicht mit Valgrind ausführen um zu erfahren, wie man eine Android-App mit einem Wrapper-Skript (in adb shell) startet.
2 Stimmen
Die Antwort muss aktualisiert werden. Der im akzeptierten Antwort angegebene Quellcode wird zu einem undefinierten Verhalten führen, da nicht asynchron-sichere Funktionen aufgerufen werden. Bitte siehe hier: stackoverflow.com/questions/34547199/…