diff --git a/libunwindstack/DexFile.cpp b/libunwindstack/DexFile.cpp index eaf867fd0..dff7a8b3c 100644 --- a/libunwindstack/DexFile.cpp +++ b/libunwindstack/DexFile.cpp @@ -22,6 +22,9 @@ #include +#define LOG_TAG "unwind" +#include + #include #include @@ -32,6 +35,19 @@ namespace unwindstack { +static bool CheckDexSupport() { + if (std::string err_msg; !art_api::dex::TryLoadLibdexfileExternal(&err_msg)) { + ALOGW("Failed to initialize DEX file support: %s", err_msg.c_str()); + return false; + } + return true; +} + +static bool HasDexSupport() { + static bool has_dex_support = CheckDexSupport(); + return has_dex_support; +} + std::unique_ptr DexFile::Create(uint64_t dex_file_offset_in_memory, Memory* memory, MapInfo* info) { if (!info->name.empty()) { @@ -57,6 +73,10 @@ bool DexFile::GetMethodInformation(uint64_t dex_offset, std::string* method_name std::unique_ptr DexFileFromFile::Create(uint64_t dex_file_offset_in_file, const std::string& file) { + if (UNLIKELY(!HasDexSupport())) { + return nullptr; + } + android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(file.c_str(), O_RDONLY | O_CLOEXEC))); if (fd == -1) { return nullptr; @@ -75,6 +95,10 @@ std::unique_ptr DexFileFromFile::Create(uint64_t dex_file_offse std::unique_ptr DexFileFromMemory::Create(uint64_t dex_file_offset_in_memory, Memory* memory, const std::string& name) { + if (UNLIKELY(!HasDexSupport())) { + return nullptr; + } + std::vector backing_memory; for (size_t size = 0;;) {