forked from OSchip/llvm-project
166 lines
4.5 KiB
C++
166 lines
4.5 KiB
C++
//===-- 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);
|
|
}
|