Home | History | Annotate | Download | only in libbacktrace
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef _LIBBACKTRACE_UNWIND_OFFLINE_H
     18 #define _LIBBACKTRACE_UNWIND_OFFLINE_H
     19 
     20 #include <libunwind.h>
     21 #include <stdint.h>
     22 #include <sys/types.h>
     23 #include <ucontext.h>
     24 
     25 #include <unordered_map>
     26 #include <unordered_set>
     27 
     28 #include <backtrace/Backtrace.h>
     29 
     30 struct Space {
     31   uint64_t start;
     32   uint64_t end;
     33   const uint8_t* data;
     34 
     35   Space() {
     36     Clear();
     37   }
     38 
     39   void Clear();
     40   size_t Read(uint64_t addr, uint8_t* buffer, size_t size);
     41 };
     42 
     43 struct DebugFrameInfo;
     44 
     45 class BacktraceOffline : public Backtrace {
     46  public:
     47   BacktraceOffline(pid_t pid, pid_t tid, BacktraceMap* map, const backtrace_stackinfo_t& stack,
     48                    bool cache_file)
     49       : Backtrace(pid, tid, map),
     50         cache_file_(cache_file),
     51         context_(nullptr) {
     52     stack_space_.start = stack.start;
     53     stack_space_.end = stack.end;
     54     stack_space_.data = stack.data;
     55   }
     56 
     57   virtual ~BacktraceOffline() = default;
     58 
     59   bool Unwind(size_t num_ignore_frames, ucontext_t* context) override;
     60 
     61   bool ReadWord(uintptr_t ptr, word_t* out_value) override;
     62 
     63   size_t Read(uintptr_t addr, uint8_t* buffer, size_t bytes) override;
     64 
     65   bool FindProcInfo(unw_addr_space_t addr_space, uint64_t ip, unw_proc_info_t* proc_info,
     66                     int need_unwind_info);
     67 
     68   bool ReadReg(size_t reg_index, uint64_t* value);
     69 
     70  protected:
     71   std::string GetFunctionNameRaw(uintptr_t pc, uintptr_t* offset) override;
     72   DebugFrameInfo* GetDebugFrameInFile(const std::string& filename);
     73 
     74   bool cache_file_;
     75   ucontext_t* context_;
     76   Space eh_frame_hdr_space_;
     77   Space eh_frame_space_;
     78   Space arm_extab_space_;
     79   Space arm_exidx_space_;
     80   Space stack_space_;
     81 };
     82 
     83 #endif  // _LIBBACKTRACE_BACKTRACE_OFFLINE_H
     84