1 /* 2 * Copyright 2005-2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #ifndef SYMBOL_LOOKUP_H 7 #define SYMBOL_LOOKUP_H 8 9 #include <stdio.h> 10 11 #include <image.h> 12 #include <OS.h> 13 14 #include <util/DoublyLinkedList.h> 15 16 17 struct image_t; 18 struct runtime_loader_debug_area; 19 20 21 namespace BPrivate { 22 namespace Debug { 23 24 class Image; 25 26 27 // Exception 28 class Exception { 29 public: 30 Exception(status_t error) 31 : fError(error) 32 { 33 } 34 35 Exception(const Exception &other) 36 : fError(other.fError) 37 { 38 } 39 40 status_t Error() const { return fError; } 41 42 private: 43 status_t fError; 44 }; 45 46 47 // Area 48 class Area : public DoublyLinkedListLinkImpl<Area> { 49 public: 50 Area(area_id id, const void *address, int32 size) 51 : fRemoteID(id), 52 fLocalID(-1), 53 fRemoteAddress(address), 54 fLocalAddress(NULL), 55 fSize(size) 56 { 57 } 58 59 ~Area() 60 { 61 if (fLocalID >= 0) 62 delete_area(fLocalID); 63 } 64 65 const void* RemoteAddress() const { return fRemoteAddress; } 66 const void* LocalAddress() const { return fLocalAddress; } 67 int32 Size() const { return fSize; } 68 69 bool ContainsAddress(const void *address, int32 size) const 70 { 71 return ((addr_t)fRemoteAddress <= (addr_t)address 72 && (addr_t)address + size <= (addr_t)fRemoteAddress + fSize); 73 } 74 75 bool ContainsLocalAddress(const void* address) const 76 { 77 return (addr_t)address >= (addr_t)fLocalAddress 78 && (addr_t)address < (addr_t)fLocalAddress + fSize; 79 } 80 81 const void *PrepareAddress(const void *address); 82 83 private: 84 area_id fRemoteID; 85 area_id fLocalID; 86 const void *fRemoteAddress; 87 void *fLocalAddress; 88 int32 fSize; 89 }; 90 91 92 // RemoteMemoryAccessor 93 class RemoteMemoryAccessor { 94 public: 95 RemoteMemoryAccessor(team_id team); 96 ~RemoteMemoryAccessor(); 97 98 status_t Init(); 99 100 const void *PrepareAddress(const void *remoteAddress, int32 size) const; 101 const void *PrepareAddressNoThrow(const void *remoteAddress, 102 int32 size) const; 103 104 template<typename Type> inline const Type &Read( 105 const Type &remoteData) const 106 { 107 const void *remoteAddress = &remoteData; 108 const void *localAddress = PrepareAddress(remoteAddress, 109 sizeof(remoteData)); 110 return *(const Type*)localAddress; 111 } 112 113 Area* AreaForLocalAddress(const void* address) const; 114 115 private: 116 Area &_FindArea(const void *address, int32 size) const; 117 Area* _FindAreaNoThrow(const void *address, int32 size) const; 118 119 typedef DoublyLinkedList<Area> AreaList; 120 121 protected: 122 team_id fTeam; 123 124 private: 125 AreaList fAreas; 126 }; 127 128 129 // SymbolIterator 130 struct SymbolIterator { 131 const Image* image; 132 int32 currentIndex; 133 }; 134 135 136 // SymbolLookup 137 class SymbolLookup : private RemoteMemoryAccessor { 138 public: 139 SymbolLookup(team_id team); 140 ~SymbolLookup(); 141 142 status_t Init(); 143 144 status_t LookupSymbolAddress(addr_t address, addr_t *_baseAddress, 145 const char **_symbolName, size_t *_symbolNameLen, 146 const char **_imageName, bool *_exactMatch) const; 147 148 status_t InitSymbolIterator(image_id imageID, 149 SymbolIterator& iterator) const; 150 status_t InitSymbolIteratorByAddress(addr_t address, 151 SymbolIterator& iterator) const; 152 status_t NextSymbol(SymbolIterator& iterator, const char** _symbolName, 153 size_t* _symbolNameLen, addr_t* _symbolAddress, size_t* _symbolSize, 154 int32* _symbolType) const; 155 156 status_t GetSymbol(image_id imageID, const char* name, int32 symbolType, 157 void** _symbolLocation, size_t* _symbolSize, int32* _symbolType) const; 158 159 private: 160 class LoadedImage; 161 friend class LoadedImage; 162 163 private: 164 const image_t* _FindLoadedImageAtAddress(addr_t address) const; 165 const image_t* _FindLoadedImageByID(image_id id) const; 166 Image* _FindImageAtAddress(addr_t address) const; 167 Image* _FindImageByID(image_id id) const; 168 size_t _SymbolNameLen(const char* address) const; 169 170 private: 171 const runtime_loader_debug_area *fDebugArea; 172 DoublyLinkedList<Image> fImages; 173 }; 174 175 } // namespace Debug 176 } // namespace BPrivate 177 178 using BPrivate::Debug::SymbolLookup; 179 180 #endif // SYMBOL_LOOKUP_H 181