Печать трассировки стека C на Android 5/Lollipop

Я пытаюсь отладить код JNI, написанный на C, работающий на Android 5. Когда вызывается одна из моих функций, я хочу записать трассировку стека в журнал adb, чтобы я мог видеть, откуда была вызвана функция.

Первые ресурсы, которые я обнаружил, указали, что мне нужно использовать libcorkscrew, и включили полные примеры использования библиотеки. К сожалению, кажется, что libcorkscrew вышел из Android 5, и теперь предполагается использовать libunwind. Для моего проекта есть несколько проблем:

  1. Инструкции по добавлению libunwind в проект редки и / или вводят в заблуждение - некоторые ресурсы говорят, что нужно загрузить проект с github и собрать его (с указаниями, которые не работают), другие указывают, что библиотека уже является частью Android 5.

  2. Все примеры написаны на C++, и кажется, что libunwind имеет только привязки C++ для функций внутри него. Так как мой код - C, а не C++, и запись в функцию журнала, а не через stdlib C++, это невозможно использовать.

Среди прочего я просмотрел эти страницы:

  1. Родные трассировки стека на Android Lollipop с libunwind

  2. Там нет "libcorkscrew" в Android 5.0...

  3. Android NDK: возвращаемся

Есть ли способ получить трассировку стека в коде C на Android 5 без сбоя программы?

2 ответа

Инструкции по включению libunwind в проект редки и / или вводят в заблуждение

Скомпилированный libunwind включен в современные Android NDK, такие как NDK r16b, по адресу sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libunwind.a, Вы должны будете предоставить этот файл компоновщику. Вам также нужно будет загрузить соответствующие заголовки, а именно libunwind.h а также __libunwind_config.h, Для NDK r16b эти заголовки можно получить здесь: https://android.googlesource.com/platform/external/libunwind_llvm/+/ndk-r16/include/.

кажется, что libunwind имеет только привязки C++

Нет, это не так. Большинство привязок libunwind- это привязки C.

Вот пример приложения для командной строки Android на чистом C, который использует libunwind:

https://github.com/alexeikh/android-ndk-backtrace-test

Можете ли вы использовать backtrace_symbos_fd на Android? Если вы можете, вы можете использовать это:

void *array[100];
size_t size;

size = backtrace (array, 100);
backtrace_symbols_fd (array, size, STDOUT_FILENO);
Другие вопросы по тегам