diff options
3 files changed, 96 insertions, 67 deletions
diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp b/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp index 7a657926475..b972ea3300e 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp @@ -126,10 +126,23 @@ RegisterContextLLDB::InitializeZerothFrame() m_cfa = cfa_regval + cfa_offset; Log *log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND); + + // A couple of sanity checks.. + if (m_cfa == (addr_t) -1 || m_cfa == 0 || m_cfa == 1) + { + if (log) + { + log->Printf("%*sFrame %d could not find a valid cfa address", + m_frame_number, "", m_frame_number); + } + m_frame_type = eNotAValidFrame; + return; + } + if (log) { - log->Printf("%*sThread %u Frame %d initialized frame current pc is 0x%llx cfa is 0x%llx", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d initialized frame current pc is 0x%llx cfa is 0x%llx", + m_frame_number, "", m_frame_number, (uint64_t) m_cfa, (uint64_t) current_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget())); } } @@ -164,8 +177,8 @@ RegisterContextLLDB::InitializeNonZerothFrame() { if (log) { - log->Printf("%*sThread %u Frame %d could not get pc value", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number); + log->Printf("%*sFrame %d could not get pc value", + m_frame_number, "", m_frame_number); } m_frame_type = eNotAValidFrame; return; @@ -179,8 +192,8 @@ RegisterContextLLDB::InitializeNonZerothFrame() { if (log) { - log->Printf("%*sThread %u Frame %d using architectural default unwind method", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number); + log->Printf("%*sFrame %d using architectural default unwind method", + m_frame_number, "", m_frame_number); } ArchSpec arch = m_thread.GetProcess().GetTarget().GetArchitecture (); ArchDefaultUnwindPlan *arch_default = ArchDefaultUnwindPlan::FindPlugin (arch); @@ -199,8 +212,8 @@ RegisterContextLLDB::InitializeNonZerothFrame() { if (log) { - log->Printf("%*sThread %u Frame %d failed to get cfa value", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number); + log->Printf("%*sFrame %d failed to get cfa value", + m_frame_number, "", m_frame_number); } m_frame_type = eNormalFrame; return; @@ -208,8 +221,8 @@ RegisterContextLLDB::InitializeNonZerothFrame() m_cfa = cfa_regval + cfa_offset; if (log) { - log->Printf("%*sThread %u Frame %d initialized frame current pc is 0x%llx cfa is 0x%llx", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d initialized frame current pc is 0x%llx cfa is 0x%llx", + m_frame_number, "", m_frame_number, (uint64_t) m_cfa, (uint64_t) current_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget())); } return; @@ -281,8 +294,8 @@ RegisterContextLLDB::InitializeNonZerothFrame() { if (log) { - log->Printf("%*sThread %u Frame %d failed to get cfa reg %d/%d", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d failed to get cfa reg %d/%d", + m_frame_number, "", m_frame_number, row_register_kind, active_row->GetCFARegister()); } m_frame_type = eNotAValidFrame; @@ -292,10 +305,22 @@ RegisterContextLLDB::InitializeNonZerothFrame() m_cfa = cfa_regval + cfa_offset; + // A couple of sanity checks.. + if (m_cfa == (addr_t) -1 || m_cfa == 0 || m_cfa == 1) + { + if (log) + { + log->Printf("%*sFrame %d could not find a valid cfa address", + m_frame_number, "", m_frame_number); + } + m_frame_type = eNotAValidFrame; + return; + } + if (log) { - log->Printf("%*sThread %u Frame %d initialized frame current pc is 0x%llx cfa is 0x%llx", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d initialized frame current pc is 0x%llx cfa is 0x%llx", + m_frame_number, "", m_frame_number, (uint64_t) m_cfa, (uint64_t) current_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget())); } } @@ -448,13 +473,13 @@ RegisterContextLLDB::GetUnwindPlansForFrame (Address current_pc) } Log *log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND); - if (log) + if (log && IsLogVerbose()) { const char *has_fast = ""; if (m_fast_unwind_plan) has_fast = ", and has a fast UnwindPlan"; - log->Printf("%*sThread %u Frame %d frame uses %s for full UnwindPlan%s", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d frame uses %s for full UnwindPlan%s", + m_frame_number, "", m_frame_number, m_full_unwind_plan->GetSourceName().GetCString(), has_fast); } @@ -630,8 +655,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc { if (log) { - log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d could not supply caller's reg %d location", + m_frame_number, "", m_frame_number, lldb_regnum); } return false; @@ -640,8 +665,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc { if (log) { - log->Printf("%*sThread %u Frame %d supplying caller's saved reg %d's location using FastUnwindPlan", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d supplying caller's saved reg %d's location using FastUnwindPlan", + m_frame_number, "", m_frame_number, lldb_regnum); } have_unwindplan_regloc = true; @@ -655,8 +680,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc { if (log) { - log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d could not supply caller's reg %d location", + m_frame_number, "", m_frame_number, lldb_regnum); } return false; @@ -665,10 +690,10 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc if (active_row->GetRegisterInfo (row_regnum, unwindplan_regloc)) { have_unwindplan_regloc = true; - if (log) + if (log && IsLogVerbose ()) { - log->Printf("%*sThread %u Frame %d supplying caller's saved reg %d's location using %s UnwindPlan", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d supplying caller's saved reg %d's location using %s UnwindPlan", + m_frame_number, "", m_frame_number, lldb_regnum, m_full_unwind_plan->GetSourceName().GetCString()); } } @@ -683,8 +708,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc { if (log) { - log->Printf("%*sThread %u Frame %d did not supply reg location for %d because it is volatile", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d did not supply reg location for %d because it is volatile", + m_frame_number, "", m_frame_number, lldb_regnum); } return false; @@ -702,18 +727,12 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc new_regloc.location.register_number = lldb_regnum; m_registers[lldb_regnum] = new_regloc; regloc = new_regloc; - if (log) - { - log->Printf("%*sThread %u Frame %d register %d is in the thread's live register context", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, - lldb_regnum); - } return true; } if (log) { - log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d could not supply caller's reg %d location", + m_frame_number, "", m_frame_number, lldb_regnum); } return false; @@ -727,8 +746,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc m_registers[lldb_regnum] = new_regloc; if (log) { - log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d could not supply caller's reg %d location", + m_frame_number, "", m_frame_number, lldb_regnum); } return false; @@ -744,8 +763,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc { if (log) { - log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d could not supply caller's reg %d location", + m_frame_number, "", m_frame_number, lldb_regnum); } return false; @@ -778,8 +797,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc { if (log) { - log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d could not supply caller's reg %d location", + m_frame_number, "", m_frame_number, lldb_regnum); } return false; @@ -792,8 +811,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc if (log) { - log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d could not supply caller's reg %d location", + m_frame_number, "", m_frame_number, lldb_regnum); } @@ -875,10 +894,10 @@ RegisterContextLLDB::ReadRegisterBytes (uint32_t lldb_reg, DataExtractor& data) if (!IsValid()) return false; - if (log) + if (log && IsLogVerbose ()) { - log->Printf("%*sThread %u Frame %d looking for register saved location for reg %d", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d looking for register saved location for reg %d", + m_frame_number, "", m_frame_number, lldb_reg); } @@ -887,8 +906,8 @@ RegisterContextLLDB::ReadRegisterBytes (uint32_t lldb_reg, DataExtractor& data) { if (log) { - log->Printf("%*sThread %u Frame %d passing along to the live register context for reg %d", - m_frame_number, "", m_thread.GetIndexID(), m_frame_number, + log->Printf("%*sFrame %d passing along to the live register context for reg %d", + m_frame_number, "", m_frame_number, lldb_reg); } return m_base_reg_ctx->ReadRegisterBytes (lldb_reg, data); diff --git a/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp b/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp index 0e2a4a7f719..58b2ee0ac5c 100644 --- a/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp +++ b/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp @@ -480,14 +480,14 @@ AssemblyParse_x86::instruction_length (Address addr, int &length) const char *triple; // FIXME should probably pass down the ArchSpec and work from that to make a portable triple if (m_cpu == k_i386) - triple = "i386-apple-darwin"; + triple = "i386-unknown-unknown"; else - triple = "x86_64-apple-darwin"; + triple = "x86_64-unknown-unknown"; EDDisassemblerRef disasm; EDInstRef cur_insn; - if (EDGetDisassembler (&disasm, "i386-apple-darwin", kEDAssemblySyntaxX86ATT) != 0) + if (EDGetDisassembler (&disasm, triple, kEDAssemblySyntaxX86ATT) != 0) { return false; } @@ -565,7 +565,15 @@ AssemblyParse_x86::get_non_call_site_unwind_plan (UnwindPlan &unwind_plan) unwind_plan.AppendRow (row); goto loopnext; } - + + if (mov_rsp_rbp_pattern_p ()) + { + row.SetOffset (current_func_text_offset + insn_len); + row.SetCFARegister (m_lldb_fp_regnum); + unwind_plan.AppendRow (row); + goto loopnext; + } + // This is the start() function (or a pthread equivalent), it starts with a pushl $0x0 which puts the // saved pc value of 0 on the stack. In this case we want to pretend we didn't see a stack movement at all -- // normally the saved pc value is already on the stack by the time the function starts executing. @@ -617,14 +625,6 @@ AssemblyParse_x86::get_non_call_site_unwind_plan (UnwindPlan &unwind_plan) goto loopnext; } - if (mov_rsp_rbp_pattern_p ()) - { - row.SetOffset (current_func_text_offset + insn_len); - row.SetCFARegister (m_lldb_fp_regnum); - unwind_plan.AppendRow (row); - goto loopnext; - } - if (ret_pattern_p ()) { // we know where the end of the function is; set the limit on the PlanValidAddressRange diff --git a/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp b/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp index 6d4c345e28e..e2d2f9c8f67 100644 --- a/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp +++ b/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp @@ -71,8 +71,8 @@ UnwindLLDB::GetFrameCount() delete register_ctx; if (log) { - log->Printf("%*sThread %u Frame %d invalid RegisterContext for this frame, stopping stack walk", - cur_idx, "", m_thread.GetIndexID(), cur_idx); + log->Printf("%*sFrame %d invalid RegisterContext for this frame, stopping stack walk", + cur_idx, "", cur_idx); } break; } @@ -81,8 +81,18 @@ UnwindLLDB::GetFrameCount() delete register_ctx; if (log) { - log->Printf("%*sThread %u Frame %d did not get CFA for this frame, stopping stack walk", - cur_idx, "", m_thread.GetIndexID(), cur_idx); + log->Printf("%*sFrame %d did not get CFA for this frame, stopping stack walk", + cur_idx, "", cur_idx); + } + break; + } + if (cursor.cfa == (addr_t) -1 || cursor.cfa == 1 || cursor.cfa == 0) + { + delete register_ctx; + if (log) + { + log->Printf("%*sFrame %d did not get a valid CFA for this frame, stopping stack walk", + cur_idx, "", cur_idx); } break; } @@ -91,8 +101,8 @@ UnwindLLDB::GetFrameCount() delete register_ctx; if (log) { - log->Printf("%*sThread %u Frame %d did not get PC for this frame, stopping stack walk", - cur_idx, "", m_thread.GetIndexID(), cur_idx); + log->Printf("%*sFrame %d did not get PC for this frame, stopping stack walk", + cur_idx, "", cur_idx); } break; } |