diff options
Diffstat (limited to 'lldb/source/Core/Debugger.cpp')
-rw-r--r-- | lldb/source/Core/Debugger.cpp | 240 |
1 files changed, 127 insertions, 113 deletions
diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index c101038ca89..83c226b7664 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -337,22 +337,22 @@ ExecutionContext Debugger::GetSelectedExecutionContext () { ExecutionContext exe_ctx; - exe_ctx.Clear(); - - TargetSP target_sp = GetSelectedTarget(); - exe_ctx.target = target_sp.get(); + TargetSP target_sp(GetSelectedTarget()); + exe_ctx.SetTargetSP (target_sp); if (target_sp) { - exe_ctx.process = target_sp->GetProcessSP().get(); - if (exe_ctx.process && exe_ctx.process->IsRunning() == false) + ProcessSP process_sp (target_sp->GetProcessSP()); + exe_ctx.SetProcessSP (process_sp); + if (process_sp && process_sp->IsRunning() == false) { - exe_ctx.thread = exe_ctx.process->GetThreadList().GetSelectedThread().get(); - if (exe_ctx.thread) + ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread()); + if (thread_sp) { - exe_ctx.frame = exe_ctx.thread->GetSelectedFrame().get(); - if (exe_ctx.frame == NULL) - exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex (0).get(); + exe_ctx.SetThreadSP (thread_sp); + exe_ctx.SetFrameSP (thread_sp->GetSelectedFrame()); + if (exe_ctx.GetFramePtr() == NULL) + exe_ctx.SetFrameSP (thread_sp->GetStackFrameAtIndex (0)); } } } @@ -1259,10 +1259,10 @@ Debugger::FormatPrompt for (;index_lower<=index_higher;index_lower++) { - ValueObject* item = ExpandIndexedExpression(target, - index_lower, - exe_ctx->frame, - false).get(); + ValueObject* item = ExpandIndexedExpression (target, + index_lower, + exe_ctx->GetFramePtr(), + false).get(); if (!item) { @@ -1307,77 +1307,85 @@ Debugger::FormatPrompt case 'p': if (::strncmp (var_name_begin, "process.", strlen("process.")) == 0) { - if (exe_ctx && exe_ctx->process != NULL) + if (exe_ctx) { - var_name_begin += ::strlen ("process."); - if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) - { - s.Printf("%i", exe_ctx->process->GetID()); - var_success = true; - } - else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) || - (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) || - (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0)) + Process *process = exe_ctx->GetProcessPtr(); + if (process) { - Module *exe_module = exe_ctx->process->GetTarget().GetExecutableModulePointer(); - if (exe_module) + var_name_begin += ::strlen ("process."); + if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) { - if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') - { - format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); - var_success = format_file_spec; - } - else + s.Printf("%i", process->GetID()); + var_success = true; + } + else if ((::strncmp (var_name_begin, "name}", strlen("name}")) == 0) || + (::strncmp (var_name_begin, "file.basename}", strlen("file.basename}")) == 0) || + (::strncmp (var_name_begin, "file.fullpath}", strlen("file.fullpath}")) == 0)) + { + Module *exe_module = process->GetTarget().GetExecutableModulePointer(); + if (exe_module) { - format_file_spec = exe_module->GetFileSpec(); - var_success = format_file_spec; + if (var_name_begin[0] == 'n' || var_name_begin[5] == 'f') + { + format_file_spec.GetFilename() = exe_module->GetFileSpec().GetFilename(); + var_success = format_file_spec; + } + else + { + format_file_spec = exe_module->GetFileSpec(); + var_success = format_file_spec; + } } } } - } + } } break; case 't': if (::strncmp (var_name_begin, "thread.", strlen("thread.")) == 0) { - if (exe_ctx && exe_ctx->thread) + if (exe_ctx) { - var_name_begin += ::strlen ("thread."); - if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) - { - s.Printf("0x%4.4x", exe_ctx->thread->GetID()); - var_success = true; - } - else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) - { - s.Printf("%u", exe_ctx->thread->GetIndexID()); - var_success = true; - } - else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) + Thread *thread = exe_ctx->GetThreadPtr(); + if (thread) { - cstr = exe_ctx->thread->GetName(); - var_success = cstr && cstr[0]; - if (var_success) - s.PutCString(cstr); - } - else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0) - { - cstr = exe_ctx->thread->GetQueueName(); - var_success = cstr && cstr[0]; - if (var_success) - s.PutCString(cstr); - } - else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0) - { - StopInfoSP stop_info_sp = exe_ctx->thread->GetStopInfo (); - if (stop_info_sp) + var_name_begin += ::strlen ("thread."); + if (::strncmp (var_name_begin, "id}", strlen("id}")) == 0) { - cstr = stop_info_sp->GetDescription(); - if (cstr && cstr[0]) - { + s.Printf("0x%4.4x", thread->GetID()); + var_success = true; + } + else if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) + { + s.Printf("%u", thread->GetIndexID()); + var_success = true; + } + else if (::strncmp (var_name_begin, "name}", strlen("name}")) == 0) + { + cstr = thread->GetName(); + var_success = cstr && cstr[0]; + if (var_success) s.PutCString(cstr); - var_success = true; + } + else if (::strncmp (var_name_begin, "queue}", strlen("queue}")) == 0) + { + cstr = thread->GetQueueName(); + var_success = cstr && cstr[0]; + if (var_success) + s.PutCString(cstr); + } + else if (::strncmp (var_name_begin, "stop-reason}", strlen("stop-reason}")) == 0) + { + StopInfoSP stop_info_sp = thread->GetStopInfo (); + if (stop_info_sp) + { + cstr = stop_info_sp->GetDescription(); + if (cstr && cstr[0]) + { + s.PutCString(cstr); + var_success = true; + } } } } @@ -1455,50 +1463,54 @@ Debugger::FormatPrompt } else if (::strncmp (var_name_begin, "frame.", strlen("frame.")) == 0) { - if (exe_ctx && exe_ctx->frame) + if (exe_ctx) { - var_name_begin += ::strlen ("frame."); - if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) - { - s.Printf("%u", exe_ctx->frame->GetFrameIndex()); - var_success = true; - } - else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0) - { - reg_kind = eRegisterKindGeneric; - reg_num = LLDB_REGNUM_GENERIC_PC; - var_success = true; - } - else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0) - { - reg_kind = eRegisterKindGeneric; - reg_num = LLDB_REGNUM_GENERIC_SP; - var_success = true; - } - else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0) - { - reg_kind = eRegisterKindGeneric; - reg_num = LLDB_REGNUM_GENERIC_FP; - var_success = true; - } - else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0) + StackFrame *frame = exe_ctx->GetFramePtr(); + if (frame) { - reg_kind = eRegisterKindGeneric; - reg_num = LLDB_REGNUM_GENERIC_FLAGS; - var_success = true; - } - else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0) - { - reg_ctx = exe_ctx->frame->GetRegisterContext().get(); - if (reg_ctx) + var_name_begin += ::strlen ("frame."); + if (::strncmp (var_name_begin, "index}", strlen("index}")) == 0) + { + s.Printf("%u", frame->GetFrameIndex()); + var_success = true; + } + else if (::strncmp (var_name_begin, "pc}", strlen("pc}")) == 0) { - var_name_begin += ::strlen ("reg."); - if (var_name_begin < var_name_end) + reg_kind = eRegisterKindGeneric; + reg_num = LLDB_REGNUM_GENERIC_PC; + var_success = true; + } + else if (::strncmp (var_name_begin, "sp}", strlen("sp}")) == 0) + { + reg_kind = eRegisterKindGeneric; + reg_num = LLDB_REGNUM_GENERIC_SP; + var_success = true; + } + else if (::strncmp (var_name_begin, "fp}", strlen("fp}")) == 0) + { + reg_kind = eRegisterKindGeneric; + reg_num = LLDB_REGNUM_GENERIC_FP; + var_success = true; + } + else if (::strncmp (var_name_begin, "flags}", strlen("flags}")) == 0) + { + reg_kind = eRegisterKindGeneric; + reg_num = LLDB_REGNUM_GENERIC_FLAGS; + var_success = true; + } + else if (::strncmp (var_name_begin, "reg.", strlen ("reg.")) == 0) + { + reg_ctx = frame->GetRegisterContext().get(); + if (reg_ctx) { - std::string reg_name (var_name_begin, var_name_end); - reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); - if (reg_info) - var_success = true; + var_name_begin += ::strlen ("reg."); + if (var_name_begin < var_name_end) + { + std::string reg_name (var_name_begin, var_name_end); + reg_info = reg_ctx->GetRegisterInfoByName (reg_name.c_str()); + if (reg_info) + var_success = true; + } } } } @@ -1564,10 +1576,11 @@ Debugger::FormatPrompt } else if (::strncmp (var_name_begin, "pc-offset}", strlen("pc-offset}")) == 0) { - var_success = exe_ctx->frame; + StackFrame *frame = exe_ctx->GetFramePtr(); + var_success = frame != NULL; if (var_success) { - format_addr = exe_ctx->frame->GetFrameCodeAddress(); + format_addr = frame->GetFrameCodeAddress(); calculate_format_addr_function_offset = true; } } @@ -1622,15 +1635,16 @@ Debugger::FormatPrompt // If format addr is valid, then we need to print an address if (reg_num != LLDB_INVALID_REGNUM) { + StackFrame *frame = exe_ctx->GetFramePtr(); // We have a register value to display... if (reg_num == LLDB_REGNUM_GENERIC_PC && reg_kind == eRegisterKindGeneric) { - format_addr = exe_ctx->frame->GetFrameCodeAddress(); + format_addr = frame->GetFrameCodeAddress(); } else { if (reg_ctx == NULL) - reg_ctx = exe_ctx->frame->GetRegisterContext().get(); + reg_ctx = frame->GetRegisterContext().get(); if (reg_ctx) { |