SIGILL в коде Android NDK - PullRequest
       1

SIGILL в коде Android NDK

10 голосов
/ 18 августа 2011

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

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

Ответы [ 2 ]

16 голосов
/ 18 августа 2011

Хорошо, я понял: NVIDIA Tegra 2 имеет только 16 64-битных регистров GPU, и поэтому для его назначения вы должны скомпилировать, используя -mfpu=vfpv3-d16. В рассматриваемой инструкции используется регистр d16, который "слишком много". (

Вот ссылка на форум NVIDIA, где сотрудник упоминает это ограничение: http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines

0 голосов
/ 18 июля 2013

Попробуйте поместить * .so в папку с именем 'externallibs' и использовать ее для сборки с помощью ndk-build, после копирования и вставки * .so в папку armeabi-v7a. Помогает мне. Другим решением является удаление поддержки Neon, если это возможно

...