64-разрядный инструмент Addr2line

#c# #android #c #unity3d

#c# #Android #c #unity3d

Вопрос:

Я ищу ошибки в сборке il2cpp Unity для Android в соответствии с этим руководствомhttps://support.unity3d.com/hc/en-us/articles/115000292166-Symbolicate-Android-crash

Он указывает 32-разрядный короткий адрес 0043a05c, который после выполнения следующей команды

 > ./arm-linux-androideabi-addr2line -f -C -e /Applications/Unity.app/Content/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Symbols/armeabi-v7a/libunity.sym.so 0043a05c

  

Расшифрован в читаемый stacktrace

 Thread :: RunThreadWrapper (void *) 18: 06: 51.501: I / DEBUG (242):
  

Но с тех пор Unity удалось успешно развиваться, и теперь он работает под управлением ARM64, и в случае моих сбоев адреса памяти теперь выглядят так

 00000000001f6f34
  

В Unity есть библиотеки для дешифрования как для 32, так и для 64 бит. Оба названы одинаково — libunity.sym.so они просто лежат в разных папках — armeabi-v7 для 32 бит и arm64-v8a для 64 бит.

Но вот проблема — когда я пытаюсь передать addr2line 64-разрядную библиотеку — он клянется, что

  C:  Program Files  Unity  Hub  Editor  2019.2.19f1  Editor  Data  PlaybackEngines  AndroidPlayer  NDK  toolchains  arm-linux-androideabi-4.9  prebuilt  windows-x86_64  bin  arm64-v8a  libunity. sym.so: File format not recognized

  

Когда я использую 32-разрядную библиотеку, все идет нормально

 $ ./arm-linux-androideabi-addr2line -f -C -e "C:  Program Files  Unity  Hub  Editor  2019.2.19f1  Editor  Data  PlaybackEngines  AndroidPlayer  NDK  toolchains  arm-linux-androideabi -4.9  prebuilt  windows-x86_64  bin  armeabi-v7a  libunity.sym.so "00000000001f6f34
mbedtls :: SuiteTLSModule_MbedtlskUnitTestCategory :: Testpubkey_ParsePem_Return_Object_And_Raise_NoError_ForPEMEncodedObjectWithoutNullTerminationHelper :: RunImpl ()
??:?

  

Но адрес, скорее всего, неверен, поскольку я пытаюсь расшифровать длинный адрес, используя 32-разрядную библиотеку. И сам модуль сбоя в режиме отладки сообщает мне, что трассировка стека этого сбоя отличается

  00000000001f6f34 /data/app/сcom.myappName/lib/arm64/libunity.so (DebugStringToFilePostprocessedStacktrace (DebugStringToFileData const amp;)   872)

  

В связи с этим несколько вопросов.

  1. Существует ли 64-разрядный addr2line или какой-либо подобный инструмент? Или это уже 32 и 64, и я просто делаю что-то не так?

  2. Почему libunity.sym.so из папки x64 не читается addr2line, говоря, что формат файла не поддерживается? И из папки x32 читается, хотя имя и формат те же! (libunity.sym.so )

  3. Если есть более нормальные инструменты, возможно, в guey, чтобы выбрать, следует ли расшифровывать, выберите трассировку стека — и она сама получила адреса памяти из трассировки стека и преобразовала их в читаемую трассировку стека?

Ответ №1:

Найдена необходимая утилита для 64 бит. 32-разрядная утилита была расположена здесь

 C:  Program Files  Unity  Hub  Editor  2019.2.19f1  Editor  Data  PlaybackEngines  AndroidPlayer  NDK  toolchains  arm-linux-androideabi-4.9  prebuilt  windows-x86_64  bin  arm-linux-androideabi- addr2line.exe
  

И здесь 64 бита

 C:  Program Files  Unity  Hub  Editor  2019.2.19f1  Editor  Data  PlaybackEngines  AndroidPlayer  NDK  toolchains  aarch64-linux-android-4.9  prebuilt  windows-x86_64  bin  aarch64-linux-android- addr2line.exe
  

И называется он немного по-другому — aarch64-linux-android-addr2line. Несмотря на то, что название утилиты не содержит слова arm, она успешно расшифровывает трассировки стека из-под arm64-v8 и нормально воспринимает символы для arm64-v8

Остальные команды те же, т.е.

 ./aarch64-linux-android-addr2line -f -C -e "C:  Program Files  Unity  Hub  Editor  2019.2.19f1  Editor  Data  PlaybackEngines  AndroidPlayer  NDK  toolchains  arm-linux-androideabi- 4.9  prebuilt  windows-x86_64  bin  arm64-v8a  libunity.sym.so "00000000001f6f34
  

Возвращает обычную трассировку стека для адреса памяти 00000000001f6f34