簡體   English   中英

在Android 5 / Lollipop上打印C堆棧跟蹤

[英]Print C stack trace on Android 5/Lollipop

我正在嘗試調試用在Android 5上運行的C編寫的JNI代碼。當我的一個函數被調用時,我想寫一個堆棧跟蹤到adb日志,這樣我就可以看到函數的調用位置了。

我發現的第一個資源表明我需要使用libcorkscrew,並包含了如何使用該庫的完整示例。 不幸的是,似乎libcorkscrew已經從Android 5中消失了,現在應該使用libunwind。 對於我的項目,有幾個問題:

  1. 將libunwind引入項目的說明很少和/或誤導 - 一些資源說從github下載項目並構建它(指示不起作用),其他人表示該庫已經是Android 5的一部分。

  2. 所有的例子都是用C ++編寫的,似乎libunwind只對其中的函數有C ++綁定。 由於我的代碼是C,而不是C ++,並且寫入日志函數而不是通過C ++ stdlib,這是不可用的。

其中,我查看了這些頁面:

  1. 使用libunwind的Android Lollipop上的本機堆棧跟蹤

  2. Android 5.0中沒有“libcorkscrew”...

  3. Android NDK:獲得回溯

有沒有辦法在Android 5上的C代碼中獲得堆棧跟蹤而不會崩潰程序?

你能在Android上使用backtrace_symbos_fd嗎? 如果可以,你可以使用這個:

void *array[100];
size_t size;

size = backtrace (array, 100);
backtrace_symbols_fd (array, size, STDOUT_FILENO);

將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綁定。

以下是純C中使用libunwind的Android命令行應用示例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM