Я выпустил приложение NDK на рынке и получил собственный отчет о сбое о сигнале SIGILL
.(Я использую Google Breakpad для создания собственных отчетов о сбоях.) Вот подробности:
- Мое приложение скомпилировано для
armeabi-v7a
, с поддержкой NEON. - Сбой на процессоре NVIDIA Tegra 2 (ARM-7 (Cortex-A9)).
- Это происходит каждый раз.(связался с пользователем)
- Адрес аварии был на
0x399cc
, сигнал был SIGILL
, и это в моем коде.
Регистры и разборка:
r4 = 0x001d50f0 r5 = 0x001d50f0 r6 = 0x598e2a3c r7 = 0x00000000
r8 = 0x00000001 r9 = 0x001c22b0 r10 = 0x00000000 fp = 0x81216264
sp = 0x598e2a18 lr = 0x816399cb pc = 0x816399cc
0x000399c6 <_ZN8Analyzer15setExpAvgFactorEi+22>: blx 0x30508
0x000399ca <_ZN8Analyzer15setExpAvgFactorEi+26>: fconstd d16, #7
0x000399ce <_ZN8Analyzer15setExpAvgFactorEi+30>: vldr d17, [pc, #32] ; 0x399f2 <_ZN8Analyzer15setExpAvgFactorEi+66>
Полный исходный код и ассемблер доступны здесь (это коротко, в основном 2 строки C ++.)
Вы можете видеть, что 0x399cc
находится в середине fconstd
инструкция.Согласно arm.com эта инструкция была добавлена в VFP-v3
, которая должна (я думаю) быть доступной в любом современном процессоре.
Что может происходить?Тот факт, что адрес находится в середине инструкции, указывает на поврежденный указатель где-нибудь?(Обратите внимание, что обратная трассировка имеет смысл, поэтому эта функция не была вызвана случайно). Или это что-то еще?