diff options
Diffstat (limited to 'runtime/jit/debugger_interface.cc')
-rw-r--r-- | runtime/jit/debugger_interface.cc | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/runtime/jit/debugger_interface.cc b/runtime/jit/debugger_interface.cc index 0efa4d2cdd..2f929bb919 100644 --- a/runtime/jit/debugger_interface.cc +++ b/runtime/jit/debugger_interface.cc @@ -25,6 +25,7 @@ #include "base/time_utils.h" #include "base/utils.h" #include "dex/dex_file.h" +#include "elf/elf_debug_reader.h" #include "jit/jit.h" #include "jit/jit_code_cache.h" #include "jit/jit_memory_region.h" @@ -606,6 +607,8 @@ void RemoveNativeDebugInfoForJit(const void* code_ptr) { // Method removal is very expensive since we need to decompress and read ELF files. // Collet methods to be removed and do the removal in bulk later. g_removed_jit_functions.push_back(code_ptr); + + VLOG(jit) << "JIT mini-debug-info removed for " << code_ptr; } void RepackNativeDebugInfoForJitLocked() { @@ -645,4 +648,18 @@ Mutex* GetNativeDebugInfoLock() { return &g_jit_debug_lock; } +void ForEachNativeDebugSymbol(std::function<void(const void*, size_t, const char*)> cb) { + MutexLock mu(Thread::Current(), g_jit_debug_lock); + using ElfRuntimeTypes = std::conditional<sizeof(void*) == 4, ElfTypes32, ElfTypes64>::type; + for (const JITCodeEntry* it = __jit_debug_descriptor.head_; it != nullptr; it = it->next_) { + ArrayRef<const uint8_t> buffer(it->symfile_addr_, it->symfile_size_); + if (!buffer.empty()) { + ElfDebugReader<ElfRuntimeTypes> reader(buffer); + reader.VisitFunctionSymbols([&](ElfRuntimeTypes::Sym sym, const char* name) { + cb(reinterpret_cast<const void*>(sym.st_value), sym.st_size, name); + }); + } + } +} + } // namespace art |