• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- sanitizer_symbolizer.h ----------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Symbolizer is intended to be used by both
11 // AddressSanitizer and ThreadSanitizer to symbolize a given
12 // address. It is an analogue of addr2line utility and allows to map
13 // instruction address to a location in source code at run-time.
14 //
15 // Symbolizer is planned to use debug information (in DWARF format)
16 // in a binary via interface defined in "llvm/DebugInfo/DIContext.h"
17 //
18 // Symbolizer code should be called from the run-time library of
19 // dynamic tools, and generally should not call memory allocation
20 // routines or other system library functions intercepted by those tools.
21 // Instead, Symbolizer code should use their replacements, defined in
22 // "compiler-rt/lib/sanitizer_common/sanitizer_libc.h".
23 //===----------------------------------------------------------------------===//
24 #ifndef SANITIZER_SYMBOLIZER_H
25 #define SANITIZER_SYMBOLIZER_H
26 
27 #include "sanitizer_internal_defs.h"
28 #include "sanitizer_libc.h"
29 // WARNING: Do not include system headers here. See details above.
30 
31 namespace __sanitizer {
32 
33 struct AddressInfo {
34   uptr address;
35   char *module;
36   uptr module_offset;
37   char *function;
38   char *file;
39   int line;
40   int column;
41 
AddressInfoAddressInfo42   AddressInfo() {
43     internal_memset(this, 0, sizeof(AddressInfo));
44   }
45   // Deletes all strings and sets all fields to zero.
46   void Clear() SANITIZER_WEAK_ATTRIBUTE;
47 
FillAddressAndModuleInfoAddressInfo48   void FillAddressAndModuleInfo(uptr addr, const char *mod_name,
49                                 uptr mod_offset) {
50     address = addr;
51     module = internal_strdup(mod_name);
52     module_offset = mod_offset;
53   }
54 };
55 
56 struct DataInfo {
57   uptr address;
58   char *module;
59   uptr module_offset;
60   char *name;
61   uptr start;
62   uptr size;
63 };
64 
65 // Fills at most "max_frames" elements of "frames" with descriptions
66 // for a given address (in all inlined functions). Returns the number
67 // of descriptions actually filled.
68 // This function should NOT be called from two threads simultaneously.
69 uptr SymbolizeCode(uptr address, AddressInfo *frames, uptr max_frames)
70     SANITIZER_WEAK_ATTRIBUTE;
71 bool SymbolizeData(uptr address, DataInfo *info);
72 
73 bool IsSymbolizerAvailable();
74 void FlushSymbolizer();  // releases internal caches (if any)
75 
76 // Attempts to demangle the provided C++ mangled name.
77 const char *Demangle(const char *name);
78 // Attempts to demangle the name via __cxa_demangle from __cxxabiv1.
79 const char *DemangleCXXABI(const char *name);
80 
81 // Starts external symbolizer program in a subprocess. Sanitizer communicates
82 // with external symbolizer via pipes.
83 bool InitializeExternalSymbolizer(const char *path_to_symbolizer);
84 
85 const int kSymbolizerStartupTimeMillis = 10;
86 
87 class LoadedModule {
88  public:
89   LoadedModule(const char *module_name, uptr base_address);
90   void addAddressRange(uptr beg, uptr end);
91   bool containsAddress(uptr address) const;
92 
full_name()93   const char *full_name() const { return full_name_; }
base_address()94   uptr base_address() const { return base_address_; }
95 
96  private:
97   struct AddressRange {
98     uptr beg;
99     uptr end;
100   };
101   char *full_name_;
102   uptr base_address_;
103   static const uptr kMaxNumberOfAddressRanges = 6;
104   AddressRange ranges_[kMaxNumberOfAddressRanges];
105   uptr n_ranges_;
106 };
107 
108 // Creates external symbolizer connected via pipe, user should write
109 // to output_fd and read from input_fd.
110 bool StartSymbolizerSubprocess(const char *path_to_symbolizer,
111                                int *input_fd, int *output_fd);
112 
113 // OS-dependent function that fills array with descriptions of at most
114 // "max_modules" currently loaded modules. Returns the number of
115 // initialized modules. If filter is nonzero, ignores modules for which
116 // filter(full_name) is false.
117 typedef bool (*string_predicate_t)(const char *);
118 uptr GetListOfModules(LoadedModule *modules, uptr max_modules,
119                       string_predicate_t filter);
120 
121 void SymbolizerPrepareForSandboxing();
122 
123 }  // namespace __sanitizer
124 
125 #endif  // SANITIZER_SYMBOLIZER_H
126