App stürzt plötzlich ab

  • Antworten:4
  • Bentwortet
Niels
  • Forum-Beiträge: 7

29.05.2011, 18:13:14 via Website

Hallo zusammen,
ich entwickle momentan an einer App, die unter anderem über das NDK eine native Bibliothek einbindet. JNI-Aufrufe passieren in beide Richtungen. Nach einiger Zeit wird die App allerdings plötzlich mit einer Speicherzugriffsverletzung beendet:

Im LogCat erhalte ich keinen Stacktrace und habe ich keine Ahnung, wo ich ansetzen soll. Es kommt nur die folgende Ausgabe:
05-29 17:36:11.008: DEBUG/Zygote(31968): Process 11816 terminated by signal (11)
05-29 17:36:11.008: INFO/ActivityManager(31973): Process com.xxx (pid 11816) has died.
05-29 17:36:11.012: INFO/WindowManager(31973): WIN DEATH: Window{484c4b60 com.xxx/com.xxx.MainActivity paused=false}

Wenn ich aktiv eine Speicherzugriffsverletzung provoziere, erhalte ich den kompletten Stacktrace. Deshalb verstehe ich nicht, warum das hier nicht der Fall ist. Ich bin für jeden Analyseansatz dankbar ;-)

Viele Grüße,
Niels

[edit]
Ich verwende NDK r5b. Mein Testgerät läuft mit Android 2.2.1
[/edit]

— geändert am 29.05.2011, 18:34:10

Antworten
Niels
  • Forum-Beiträge: 7

06.06.2011, 16:47:23 via Website

Gelöst. Ursache war eine Endlosrekursion im C++-Code. Dummerweise wird die App in diesem Fall einfach gekillt. Einen Stacktrace gibt's nicht.

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

06.06.2011, 18:28:53 via Website

Auch wenn es gelöst ist,

Signal 11 ist wenn ich mich recht erinnere ein "SIGSEGV" (Signal: Segmentation Vault)

Das bedeutet nichts anderes als das Dein C-Code versucht auf Speicher zuzugreifen, den er eigentlich nicht haben sollte.

Nur so für die Zukunft, kann ja mal nützlich sein.

lg Voss

Antworten
Niels
  • Forum-Beiträge: 7

06.06.2011, 22:38:43 via Website

Hallo Jörg,
um unsere beiden Posts zusammenzuführen: Die Endlosrekursion erzeugt einen Stackoverflow und damit eine Speicherzugriffsverletzung (SEGV). In der Folge wird die Anwendung vom System gekillt. Das lässt sich ganz einfach mit folgender C-Funktion nachvollziehen:
1void bla()
2{
3 bla();
4}

Die für mich noch offene Frage: Warum gibt es keinen Stacktrace? Liegt das daran, dass der Stack nach dem Überlauf einfach kaputt ist?

Viele Grüße,
Niels

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

06.06.2011, 23:15:39 via Website

Also soweit ich mich an meine lang lang zurückliegende Zeit erinnere als ich mal c++ gelernt habe, könnte es daran liegen, dass der Handler der den SegV eigentlich behandeln soll, auf dem Stack entweder nicht vorhanden ist oder aber zu tief auf dem Stack.

Irgendwie meine ich mich zu erinnern, dass man einen eigenen Handler dafür initialisieren kann/muss ?? <-- da beginnen meine klaffenden Lücken .

Aber schau mal hier .. das hab ich gerade noch gefunden: http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes

Ob das allerdings für das NDK so auch gilt ... isch weiss es wirklisch nischt ... :(:(
(Ich hab damals unter HP-UX so kleine C-Utilitys geschrieben .. echt nur Kleinkram für unsere SAP-R3 Hosts..)

— geändert am 06.06.2011, 23:17:34

lg Voss

Antworten