1 //===-- SBTrace.cpp -------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Target/Process.h" 10 #include "lldb/Utility/Instrumentation.h" 11 12 #include "lldb/API/SBDebugger.h" 13 #include "lldb/API/SBStructuredData.h" 14 #include "lldb/API/SBThread.h" 15 #include "lldb/API/SBTrace.h" 16 17 #include "lldb/Core/StructuredDataImpl.h" 18 19 #include <memory> 20 21 using namespace lldb; 22 using namespace lldb_private; 23 using namespace llvm; 24 25 SBTrace::SBTrace() { LLDB_INSTRUMENT_VA(this); } 26 27 SBTrace::SBTrace(const lldb::TraceSP &trace_sp) : m_opaque_sp(trace_sp) { 28 LLDB_INSTRUMENT_VA(this, trace_sp); 29 } 30 31 SBTrace SBTrace::LoadTraceFromFile(SBError &error, SBDebugger &debugger, 32 const SBFileSpec &trace_description_file) { 33 LLDB_INSTRUMENT_VA(error, debugger, trace_description_file); 34 35 Expected<lldb::TraceSP> trace_or_err = Trace::LoadPostMortemTraceFromFile( 36 debugger.ref(), trace_description_file.ref()); 37 38 if (!trace_or_err) { 39 error.SetErrorString(toString(trace_or_err.takeError()).c_str()); 40 return SBTrace(); 41 } 42 43 return SBTrace(trace_or_err.get()); 44 } 45 46 const char *SBTrace::GetStartConfigurationHelp() { 47 LLDB_INSTRUMENT_VA(this); 48 return m_opaque_sp ? m_opaque_sp->GetStartConfigurationHelp() : nullptr; 49 } 50 51 SBError SBTrace::Start(const SBStructuredData &configuration) { 52 LLDB_INSTRUMENT_VA(this, configuration); 53 SBError error; 54 if (!m_opaque_sp) 55 error.SetErrorString("error: invalid trace"); 56 else if (llvm::Error err = 57 m_opaque_sp->Start(configuration.m_impl_up->GetObjectSP())) 58 error.SetErrorString(llvm::toString(std::move(err)).c_str()); 59 return error; 60 } 61 62 SBError SBTrace::Start(const SBThread &thread, 63 const SBStructuredData &configuration) { 64 LLDB_INSTRUMENT_VA(this, thread, configuration); 65 66 SBError error; 67 if (!m_opaque_sp) 68 error.SetErrorString("error: invalid trace"); 69 else { 70 if (llvm::Error err = 71 m_opaque_sp->Start(std::vector<lldb::tid_t>{thread.GetThreadID()}, 72 configuration.m_impl_up->GetObjectSP())) 73 error.SetErrorString(llvm::toString(std::move(err)).c_str()); 74 } 75 76 return error; 77 } 78 79 SBError SBTrace::Stop() { 80 LLDB_INSTRUMENT_VA(this); 81 SBError error; 82 if (!m_opaque_sp) 83 error.SetErrorString("error: invalid trace"); 84 else if (llvm::Error err = m_opaque_sp->Stop()) 85 error.SetErrorString(llvm::toString(std::move(err)).c_str()); 86 return error; 87 } 88 89 SBError SBTrace::Stop(const SBThread &thread) { 90 LLDB_INSTRUMENT_VA(this, thread); 91 SBError error; 92 if (!m_opaque_sp) 93 error.SetErrorString("error: invalid trace"); 94 else if (llvm::Error err = m_opaque_sp->Stop({thread.GetThreadID()})) 95 error.SetErrorString(llvm::toString(std::move(err)).c_str()); 96 return error; 97 } 98 99 bool SBTrace::IsValid() { 100 LLDB_INSTRUMENT_VA(this); 101 return this->operator bool(); 102 } 103 104 SBTrace::operator bool() const { 105 LLDB_INSTRUMENT_VA(this); 106 return (bool)m_opaque_sp; 107 } 108