| //===-- Xcode.cpp -----------------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "Xcode.h" |
| #include <string> |
| |
| using namespace std; |
| using namespace lldb_perf; |
| |
| void |
| Xcode::FetchVariable (SBValue value, uint32_t expand, bool verbose) |
| { |
| auto name = value.GetName(); |
| auto num_value = value.GetValueAsUnsigned(0); |
| auto summary = value.GetSummary(); |
| auto in_scope = value.IsInScope(); |
| auto has_children = value.MightHaveChildren(); |
| auto type_1 = value.GetType(); |
| auto type_2 = value.GetType(); |
| auto type_name_1 = value.GetTypeName(); |
| auto type_3 = value.GetType(); |
| auto type_name_2 = value.GetTypeName(); |
| if (verbose) |
| printf("%s %s = 0x%llx (%llu) %s\n",value.GetTypeName(),value.GetName(),num_value, num_value,summary); |
| if (expand > 0) |
| { |
| auto count = value.GetNumChildren(); |
| for (int i = 0; i < count; i++) |
| { |
| SBValue child(value.GetChildAtIndex(i, lldb::eDynamicCanRunTarget, true)); |
| FetchVariable (child,expand-1,verbose); |
| } |
| } |
| } |
| |
| void |
| Xcode::FetchModules (SBTarget target, bool verbose) |
| { |
| auto count = target.GetNumModules(); |
| for (int i = 0; i < count; i++) |
| { |
| SBModule module(target.GetModuleAtIndex(i)); |
| auto fspec = module.GetFileSpec(); |
| std::string path(1024,0); |
| fspec.GetPath(&path[0],1024); |
| auto uuid = module.GetUUIDBytes(); |
| if (verbose) |
| { |
| printf("%s %s\n",path.c_str(),module.GetUUIDString()); |
| } |
| } |
| } |
| |
| void |
| Xcode::FetchVariables (SBFrame frame, uint32_t expand, bool verbose) |
| { |
| auto values = frame.GetVariables (true,true,true,false, eDynamicCanRunTarget); |
| auto count = values.GetSize(); |
| for (int i = 0; i < count; i++) |
| { |
| SBValue value(values.GetValueAtIndex(i)); |
| FetchVariable (value,expand,verbose); |
| } |
| } |
| |
| void |
| Xcode::FetchFrames(SBProcess process, bool variables, bool verbose) |
| { |
| auto pCount = process.GetNumThreads(); |
| for (int p = 0; p < pCount; p++) |
| { |
| SBThread thread(process.GetThreadAtIndex(p)); |
| auto tCount = thread.GetNumFrames (); |
| if (verbose) |
| printf("%s %d %d {%d}\n",thread.GetQueueName(),tCount,thread.GetStopReason(),eStopReasonBreakpoint); |
| for (int t = 0; t < tCount; t++) |
| { |
| SBFrame frame(thread.GetFrameAtIndex(t)); |
| auto fp = frame.GetFP(); |
| SBThread thread_dup = frame.GetThread(); |
| SBFileSpec filespec(process.GetTarget().GetExecutable()); |
| std::string path(1024,0); |
| filespec.GetPath(&path[0],1024); |
| auto state = process.GetState(); |
| auto pCount_dup = process.GetNumThreads(); |
| auto byte_size = process.GetAddressByteSize(); |
| auto pc = frame.GetPC(); |
| SBSymbolContext context(frame.GetSymbolContext(0x0000006e)); |
| SBModule module(context.GetModule()); |
| SBLineEntry entry(context.GetLineEntry()); |
| SBFileSpec entry_filespec(process.GetTarget().GetExecutable()); |
| std::string entry_path(1024,0); |
| entry_filespec.GetPath(&entry_path[0],1024); |
| auto line_1 = entry.GetLine(); |
| auto line_2 = entry.GetLine(); |
| auto fname = frame.GetFunctionName(); |
| if (verbose) |
| printf("%llu %s %d %d %llu %s %d %s\n",fp,path.c_str(),state,byte_size,pc,entry_path.c_str(),line_1,fname); |
| if (variables) |
| FetchVariables (frame, 0, verbose); |
| } |
| } |
| } |
| |
| void |
| Xcode::RunExpression (SBFrame frame, const char* expression, bool po, bool verbose) |
| { |
| SBValue value (frame.EvaluateExpression (expression, eDynamicCanRunTarget)); |
| FetchVariable (value,0,verbose); |
| if (po) |
| { |
| auto descr = value.GetObjectDescription(); |
| if (descr) |
| printf("po = %s\n",descr); |
| } |
| } |
| |
| void |
| Xcode::Next (SBThread thread) |
| { |
| thread.StepOver(); |
| } |
| |
| void |
| Xcode::Continue (SBProcess process) |
| { |
| process.Continue(); |
| } |
| |
| void |
| Xcode::RunCommand (SBDebugger debugger, const char* cmd, bool verbose) |
| { |
| SBCommandReturnObject sb_ret; |
| auto interpreter = debugger.GetCommandInterpreter(); |
| interpreter.HandleCommand(cmd,sb_ret); |
| if (verbose) |
| printf("%s\n%s\n",sb_ret.GetOutput(false),sb_ret.GetError(false)); |
| } |
| |
| SBThread |
| Xcode::GetThreadWithStopReason (SBProcess process, StopReason reason) |
| { |
| auto threads_count = process.GetNumThreads(); |
| for (auto thread_num = 0; thread_num < threads_count; thread_num++) |
| { |
| SBThread thread(process.GetThreadAtIndex(thread_num)); |
| if (thread.GetStopReason() == reason) |
| { |
| return thread; |
| } |
| } |
| return SBThread(); |
| } |
| |
| SBBreakpoint |
| Xcode::CreateFileLineBreakpoint (SBTarget target, const char* file, uint32_t line) |
| { |
| return target.BreakpointCreateByLocation(file, line); |
| } |