diff options
author | Christopher Ferris <cferris@google.com> | 2017-12-20 18:49:01 -0800 |
---|---|---|
committer | Christopher Ferris <cferris@google.com> | 2018-01-12 11:18:42 -0800 |
commit | 395f42d36d37a81ce1c11918bfded0a2afaa6195 (patch) | |
tree | bb93f9254cc8a9757efcb30381777c887e061aea /libunwindstack/include/unwindstack/JitDebug.h | |
parent | 25b928937f95e7cee042350993700f0c6d67bb5c (diff) | |
download | unwinding-395f42d36d37a81ce1c11918bfded0a2afaa6195.tar.gz |
Add ability to read jit gdb data.
Changes:
- New JitDebug class to handle all of the jit gdb interface.
- Add unit tests for all, along with new offline test using debug data.
- Add new Memory type called MemoryOfflineParts that has multiple
MemoryOffline objects to support the offline test.
- Update the tools to use the JitDebug object.
- Modify libbacktrace to use the JitDebug, but only looking in libart.so
and libartd.so.
- Change the Format32Bits to Is32Bit since it's more accurate and I use
it in a different context where original name didn't make sense.
- Add a new function to find global variables in an elf file
(GetGlobalVariable).
- Add a new function to determine if a pc is valid for this elf (IsValidPc).
Bug: 68396769
Test: Ran new unit tests. Added new offline test that uses jit debug data.
Test: Ran art test that generates jit data and verified a crash unwinds
Test: through the jit data.
Change-Id: I6e7ee2f5bab2242028a06feece156dff21c0a974
Diffstat (limited to 'libunwindstack/include/unwindstack/JitDebug.h')
-rw-r--r-- | libunwindstack/include/unwindstack/JitDebug.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/libunwindstack/include/unwindstack/JitDebug.h b/libunwindstack/include/unwindstack/JitDebug.h new file mode 100644 index 0000000..0bcd0b0 --- /dev/null +++ b/libunwindstack/include/unwindstack/JitDebug.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBUNWINDSTACK_JIT_DEBUG_H +#define _LIBUNWINDSTACK_JIT_DEBUG_H + +#include <stdint.h> + +#include <memory> +#include <mutex> +#include <string> +#include <vector> + +namespace unwindstack { + +// Forward declarations. +class Elf; +class Maps; +class Memory; +enum ArchEnum : uint8_t; + +class JitDebug { + public: + explicit JitDebug(std::shared_ptr<Memory>& memory); + JitDebug(std::shared_ptr<Memory>& memory, std::vector<std::string>& search_libs); + ~JitDebug(); + + Elf* GetElf(Maps* maps, uint64_t pc); + + void SetArch(ArchEnum arch); + + private: + void Init(Maps* maps); + + std::shared_ptr<Memory> memory_; + uint64_t entry_addr_ = 0; + bool initialized_ = false; + std::vector<Elf*> elf_list_; + std::vector<std::string> search_libs_; + + std::mutex lock_; + + uint64_t (JitDebug::*read_descriptor_func_)(uint64_t) = nullptr; + uint64_t (JitDebug::*read_entry_func_)(uint64_t*, uint64_t*) = nullptr; + + uint64_t ReadDescriptor32(uint64_t); + uint64_t ReadDescriptor64(uint64_t); + + uint64_t ReadEntry32Pack(uint64_t* start, uint64_t* size); + uint64_t ReadEntry32Pad(uint64_t* start, uint64_t* size); + uint64_t ReadEntry64(uint64_t* start, uint64_t* size); +}; + +} // namespace unwindstack + +#endif // _LIBUNWINDSTACK_JIT_DEBUG_H |