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:
armeabi-v7a
, mit NEON-Unterstützung kompiliert. 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?
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: Ссылка
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
Tags und Links android c++ assembly android-ndk arm