| 1 | // Licensed to the .NET Foundation under one or more agreements. |
| 2 | // The .NET Foundation licenses this file to you under the MIT license. |
| 3 | // See the LICENSE file in the project root for more information. |
| 4 | |
| 5 | #include <cstdarg> |
| 6 | |
| 7 | class LLDBServices : public ILLDBServices |
| 8 | { |
| 9 | private: |
| 10 | LONG m_ref; |
| 11 | lldb::SBDebugger &m_debugger; |
| 12 | lldb::SBCommandReturnObject &m_returnObject; |
| 13 | |
| 14 | lldb::SBProcess *m_currentProcess; |
| 15 | lldb::SBThread *m_currentThread; |
| 16 | |
| 17 | void OutputString(ULONG mask, PCSTR str); |
| 18 | ULONG64 GetModuleBase(lldb::SBTarget& target, lldb::SBModule& module); |
| 19 | DWORD_PTR GetExpression(lldb::SBFrame& frame, lldb::SBError& error, PCSTR exp); |
| 20 | void GetContextFromFrame(lldb::SBFrame& frame, DT_CONTEXT *dtcontext); |
| 21 | DWORD_PTR GetRegister(lldb::SBFrame& frame, const char *name); |
| 22 | |
| 23 | lldb::SBProcess GetCurrentProcess(); |
| 24 | lldb::SBThread GetCurrentThread(); |
| 25 | lldb::SBFrame GetCurrentFrame(); |
| 26 | |
| 27 | public: |
| 28 | LLDBServices(lldb::SBDebugger &debugger, lldb::SBCommandReturnObject &returnObject, lldb::SBProcess *process = nullptr, lldb::SBThread *thread = nullptr); |
| 29 | ~LLDBServices(); |
| 30 | |
| 31 | //---------------------------------------------------------------------------- |
| 32 | // IUnknown |
| 33 | //---------------------------------------------------------------------------- |
| 34 | |
| 35 | HRESULT STDMETHODCALLTYPE QueryInterface( |
| 36 | REFIID InterfaceId, |
| 37 | PVOID* Interface); |
| 38 | |
| 39 | ULONG STDMETHODCALLTYPE AddRef(); |
| 40 | |
| 41 | ULONG STDMETHODCALLTYPE Release(); |
| 42 | |
| 43 | //---------------------------------------------------------------------------- |
| 44 | // ILLDBServices |
| 45 | //---------------------------------------------------------------------------- |
| 46 | |
| 47 | PCSTR GetCoreClrDirectory(); |
| 48 | |
| 49 | DWORD_PTR GetExpression( |
| 50 | PCSTR exp); |
| 51 | |
| 52 | HRESULT VirtualUnwind( |
| 53 | DWORD threadID, |
| 54 | ULONG32 contextSize, |
| 55 | PBYTE context); |
| 56 | |
| 57 | HRESULT SetExceptionCallback( |
| 58 | PFN_EXCEPTION_CALLBACK callback); |
| 59 | |
| 60 | HRESULT ClearExceptionCallback(); |
| 61 | |
| 62 | //---------------------------------------------------------------------------- |
| 63 | // IDebugControl2 |
| 64 | //---------------------------------------------------------------------------- |
| 65 | |
| 66 | HRESULT GetInterrupt(); |
| 67 | |
| 68 | HRESULT Output( |
| 69 | ULONG mask, |
| 70 | PCSTR format, |
| 71 | ...); |
| 72 | |
| 73 | HRESULT OutputVaList( |
| 74 | ULONG mask, |
| 75 | PCSTR format, |
| 76 | va_list args); |
| 77 | |
| 78 | HRESULT ControlledOutput( |
| 79 | ULONG outputControl, |
| 80 | ULONG mask, |
| 81 | PCSTR format, |
| 82 | ...); |
| 83 | |
| 84 | HRESULT ControlledOutputVaList( |
| 85 | ULONG outputControl, |
| 86 | ULONG mask, |
| 87 | PCSTR format, |
| 88 | va_list args); |
| 89 | |
| 90 | HRESULT GetDebuggeeType( |
| 91 | PULONG debugClass, |
| 92 | PULONG qualifier); |
| 93 | |
| 94 | HRESULT GetPageSize( |
| 95 | PULONG size); |
| 96 | |
| 97 | HRESULT GetExecutingProcessorType( |
| 98 | PULONG type); |
| 99 | |
| 100 | HRESULT Execute( |
| 101 | ULONG outputControl, |
| 102 | PCSTR command, |
| 103 | ULONG flags); |
| 104 | |
| 105 | HRESULT GetLastEventInformation( |
| 106 | PULONG type, |
| 107 | PULONG processId, |
| 108 | PULONG threadId, |
| 109 | PVOID , |
| 110 | ULONG , |
| 111 | PULONG , |
| 112 | PSTR description, |
| 113 | ULONG descriptionSize, |
| 114 | PULONG descriptionUsed); |
| 115 | |
| 116 | HRESULT Disassemble( |
| 117 | ULONG64 offset, |
| 118 | ULONG flags, |
| 119 | PSTR buffer, |
| 120 | ULONG bufferSize, |
| 121 | PULONG disassemblySize, |
| 122 | PULONG64 endOffset); |
| 123 | |
| 124 | //---------------------------------------------------------------------------- |
| 125 | // IDebugControl4 |
| 126 | //---------------------------------------------------------------------------- |
| 127 | |
| 128 | HRESULT |
| 129 | GetContextStackTrace( |
| 130 | PVOID startContext, |
| 131 | ULONG startContextSize, |
| 132 | PDEBUG_STACK_FRAME frames, |
| 133 | ULONG framesSize, |
| 134 | PVOID frameContexts, |
| 135 | ULONG frameContextsSize, |
| 136 | ULONG frameContextsEntrySize, |
| 137 | PULONG framesFilled); |
| 138 | |
| 139 | //---------------------------------------------------------------------------- |
| 140 | // IDebugDataSpaces |
| 141 | //---------------------------------------------------------------------------- |
| 142 | |
| 143 | HRESULT ReadVirtual( |
| 144 | ULONG64 offset, |
| 145 | PVOID buffer, |
| 146 | ULONG bufferSize, |
| 147 | PULONG bytesRead); |
| 148 | |
| 149 | HRESULT WriteVirtual( |
| 150 | ULONG64 offset, |
| 151 | PVOID buffer, |
| 152 | ULONG bufferSize, |
| 153 | PULONG bytesWritten); |
| 154 | |
| 155 | //---------------------------------------------------------------------------- |
| 156 | // IDebugSymbols |
| 157 | //---------------------------------------------------------------------------- |
| 158 | |
| 159 | HRESULT GetSymbolOptions( |
| 160 | PULONG options); |
| 161 | |
| 162 | HRESULT GetNameByOffset( |
| 163 | ULONG64 offset, |
| 164 | PSTR nameBuffer, |
| 165 | ULONG nameBufferSize, |
| 166 | PULONG nameSize, |
| 167 | PULONG64 displacement); |
| 168 | |
| 169 | HRESULT GetNumberModules( |
| 170 | PULONG loaded, |
| 171 | PULONG unloaded); |
| 172 | |
| 173 | HRESULT GetModuleByIndex( |
| 174 | ULONG index, |
| 175 | PULONG64 base); |
| 176 | |
| 177 | HRESULT GetModuleByModuleName( |
| 178 | PCSTR name, |
| 179 | ULONG startIndex, |
| 180 | PULONG index, |
| 181 | PULONG64 base); |
| 182 | |
| 183 | HRESULT GetModuleByOffset( |
| 184 | ULONG64 offset, |
| 185 | ULONG startIndex, |
| 186 | PULONG index, |
| 187 | PULONG64 base); |
| 188 | |
| 189 | HRESULT GetModuleNames( |
| 190 | ULONG index, |
| 191 | ULONG64 base, |
| 192 | PSTR imageNameBuffer, |
| 193 | ULONG imageNameBufferSize, |
| 194 | PULONG imageNameSize, |
| 195 | PSTR moduleNameBuffer, |
| 196 | ULONG moduleNameBufferSize, |
| 197 | PULONG moduleNameSize, |
| 198 | PSTR loadedImageNameBuffer, |
| 199 | ULONG loadedImageNameBufferSize, |
| 200 | PULONG loadedImageNameSize); |
| 201 | |
| 202 | HRESULT GetLineByOffset( |
| 203 | ULONG64 offset, |
| 204 | PULONG line, |
| 205 | PSTR fileBuffer, |
| 206 | ULONG fileBufferSize, |
| 207 | PULONG fileSize, |
| 208 | PULONG64 displacement); |
| 209 | |
| 210 | HRESULT GetSourceFileLineOffsets( |
| 211 | PCSTR file, |
| 212 | PULONG64 buffer, |
| 213 | ULONG bufferLines, |
| 214 | PULONG fileLines); |
| 215 | |
| 216 | HRESULT FindSourceFile( |
| 217 | ULONG startElement, |
| 218 | PCSTR file, |
| 219 | ULONG flags, |
| 220 | PULONG foundElement, |
| 221 | PSTR buffer, |
| 222 | ULONG bufferSize, |
| 223 | PULONG foundSize); |
| 224 | |
| 225 | //---------------------------------------------------------------------------- |
| 226 | // IDebugSystemObjects |
| 227 | //---------------------------------------------------------------------------- |
| 228 | |
| 229 | HRESULT GetCurrentProcessId( |
| 230 | PULONG id); |
| 231 | |
| 232 | HRESULT GetCurrentThreadId( |
| 233 | PULONG id); |
| 234 | |
| 235 | HRESULT SetCurrentThreadId( |
| 236 | ULONG id); |
| 237 | |
| 238 | HRESULT GetCurrentThreadSystemId( |
| 239 | PULONG sysId); |
| 240 | |
| 241 | HRESULT GetThreadIdBySystemId( |
| 242 | ULONG sysId, |
| 243 | PULONG threadId); |
| 244 | |
| 245 | HRESULT GetThreadContextById( |
| 246 | ULONG32 threadID, |
| 247 | ULONG32 contextFlags, |
| 248 | ULONG32 contextSize, |
| 249 | PBYTE context); |
| 250 | |
| 251 | //---------------------------------------------------------------------------- |
| 252 | // IDebugRegisters |
| 253 | //---------------------------------------------------------------------------- |
| 254 | |
| 255 | HRESULT GetValueByName( |
| 256 | PCSTR name, |
| 257 | PDWORD_PTR debugValue); |
| 258 | |
| 259 | HRESULT GetInstructionOffset( |
| 260 | PULONG64 offset); |
| 261 | |
| 262 | HRESULT GetStackOffset( |
| 263 | PULONG64 offset); |
| 264 | |
| 265 | HRESULT GetFrameOffset( |
| 266 | PULONG64 offset); |
| 267 | |
| 268 | //---------------------------------------------------------------------------- |
| 269 | // LLDBServices (internal) |
| 270 | //---------------------------------------------------------------------------- |
| 271 | |
| 272 | PCSTR GetModuleDirectory( |
| 273 | PCSTR name); |
| 274 | }; |
| 275 | |