SIGILL im Android NDK-Code

8

Ich habe eine NDK-App auf dem Markt und habe einen nativen Absturzbericht über ein SIGILL -Signal erhalten. (Ich verwende Google breakpad, um native Absturzberichte zu generieren.) Hier sind die Details:

  • Meine App wurde für armeabi-v7a , mit NEON-Unterstützung kompiliert.
  • Es ist auf einem NVIDIA Tegra 2 Prozessor abgestürzt, der ARM-7 (Cortex-A9) ist.
  • Es passiert jedes Mal. (kontaktierte den Benutzer)
  • Die Absturzadresse war 0x399cc , das Signal war SIGILL und steht in meinem Code.

Register und Demontage:

%Vor%

Vollständige Quelle und Assembler verfügbar hier (es ist kurz, im Grunde genommen zwei Zeilen C ++.)

Sie können sehen, dass sich 0x399cc in der Mitte der Anweisung fconstd befindet. Laut arm.com wurde diese Anweisung hinzugefügt in VFP-v3 , was (denke ich) in jedem modernen Prozessor verfügbar sein sollte.

Was könnte passieren? Hat die Tatsache, dass sich die Adresse in der Mitte einer Anweisung befindet, irgendwo auf einen beschädigten Zeiger hin? (Beachten Sie, dass das Backtrace vollkommen Sinn macht, also ist es nicht so, dass diese Funktion versehentlich aufgerufen wurde.) Oder ist es etwas anderes?

    
tmandry 18.08.2011, 05:03
quelle

2 Antworten

15

Ok, ich habe es verstanden: Die NVIDIA Tegra 2 hat nur 16 64-Bit-GPU-Register, und daher müssen Sie sie mit -mfpu=vfpv3-d16 kompilieren. Die betreffende Anweisung verwendet das Register d16 , was "einfach zu viel" ist. : (

Hier ist ein Verweis auf ein NVIDIA-Forum, wo ein Mitarbeiter diese Einschränkung erwähnt: Ссылка

    
Jay Freeman -saurik- 18.08.2011, 08:00
quelle
0

Versuchen Sie, * .so in einen Ordner namens 'externallibs' zu stellen und verwenden Sie ihn, um nach dem Kopieren und Einfügen * .so in den Ordner armeabi-v7a nach ndk-build zu erstellen. Es hilft mir. Eine andere Lösung ist, die Neon-Unterstützung zu entfernen, wenn es möglich ist

    
ZanoOnStack 18.07.2013 12:55
quelle