SIGILL в коде Android NDK

У меня есть приложение NDK на рынке, и я получил собственный отчет о сбое Сигнал SIGILL . (Я использую панель управления Google для создания собственных отчетов о сбоях.) Вот подробности:

  • Мое приложение скомпилировано для 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 , который (я думаю) должен быть доступен в любом современном процессоре.

Что может происходить? Указывает ли тот факт, что адрес находится в середине инструкции, на поврежденный указатель? (Обратите внимание, что обратная трассировка имеет смысл, поэтому не похоже, что эта функция была вызвана случайно.) Или это что-то еще?

10
задан tmandry 18 August 2011 в 05:03
поделиться