Wie kann ich SIGSEGV (Segmentierungsfehler) abfangen und unter JNI auf Android einen Stack-Trace abrufen?

Ich ziehe umein Projekt auf das neue Android Native Development Kit (zB JNI) und ich möchte SIGSEGV abfangen, sollte es vorkommen (evtl. auch SIGILL, SIGABRT, SIGFPE), um statt (oder vorher) einen schönen Crash-Reporting-Dialog zu präsentieren passiert: der sofortige und schnelle Tod des Prozesses und möglicherweise ein Versuch des Betriebssystems, ihn neu zu starten. (Bearbeiten: Die JVM / Dalvik-VM empfängt das Signal und protokolliert einen Stack-Trace und andere nützliche Informationen. Ich möchte dem Benutzer nur die Möglichkeit bieten, mir diese Informationen wirklich per E-Mail zu senden.)

Die Situation ist: Ein großer Teil des C-Codes, den ich nicht geschrieben habe, erledigt die meiste Arbeit in dieser Anwendung (die gesamte Spielelogik) und obwohl es auf zahlreichen anderen Plattformen getestet wurde, ist es durchaus möglich, dass ich in meinem Android Port, wird es Müll füttern und einen Absturz im nativen Code verursachen, also möchte ich die Absturzabbilder (sowohl native als auch Java), die derzeit im Android-Protokoll angezeigt werden (ich denke, es wäre stderr in einer Nicht-Android-Situation). Es steht mir frei, sowohl C- als auch Java-Code beliebig zu ändern, obwohl die Rückrufe (sowohl eingehend als auch ausgehend von JNI) ungefähr 40 betragen und offensichtlich Bonuspunkte für kleine Unterschiede.

Ich habe von der Signalverkettungsbibliothek in J2SE, libjsig.so, gehört, und wenn ich einen Signalhandler wie diesen unter Android sicher installieren könnte, würde dies den entscheidenden Teil meiner Frage lösen, aber ich sehe keine solche Bibliothek für Android / Dalvik .

Antworten auf die Frage(4)

Ihre Antwort auf die Frage