From 8ec10efc5d210c460aea11d31e0d1acd6af233ed Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Fri, 18 Oct 2013 17:38:31 +0000 Subject: [PATCH] Mark the selected frame of the selected thread in backtraces. llvm-svn: 192989 --- lldb/include/lldb/Target/StackFrame.h | 5 +++-- lldb/include/lldb/Target/StackFrameList.h | 3 ++- lldb/source/Target/StackFrame.cpp | 11 ++++++++--- lldb/source/Target/StackFrameList.cpp | 24 +++++++++++++++++++++-- lldb/source/Target/Thread.cpp | 14 ++++++++++--- 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/lldb/include/lldb/Target/StackFrame.h b/lldb/include/lldb/Target/StackFrame.h index 877bd8ce661b..c7b7e3768122 100644 --- a/lldb/include/lldb/Target/StackFrame.h +++ b/lldb/include/lldb/Target/StackFrame.h @@ -121,7 +121,7 @@ public: Disassemble (); void - DumpUsingSettingsFormat (Stream *strm); + DumpUsingSettingsFormat (Stream *strm, const char *frame_marker = NULL); void Dump (Stream *strm, bool show_frame_index, bool show_fullpaths); @@ -165,7 +165,8 @@ public: bool GetStatus (Stream &strm, bool show_frame_info, - bool show_source); + bool show_source, + const char *frame_marker = NULL); protected: friend class StackFrameList; diff --git a/lldb/include/lldb/Target/StackFrameList.h b/lldb/include/lldb/Target/StackFrameList.h index b2689d0391e9..2680be3e5a68 100644 --- a/lldb/include/lldb/Target/StackFrameList.h +++ b/lldb/include/lldb/Target/StackFrameList.h @@ -88,7 +88,8 @@ public: uint32_t first_frame, uint32_t num_frames, bool show_frame_info, - uint32_t num_frames_with_source); + uint32_t num_frames_with_source, + const char *frame_marker = NULL); protected: diff --git a/lldb/source/Target/StackFrame.cpp b/lldb/source/Target/StackFrame.cpp index 3c4c43d9f44c..a05c03db1ba3 100644 --- a/lldb/source/Target/StackFrame.cpp +++ b/lldb/source/Target/StackFrame.cpp @@ -1275,7 +1275,7 @@ StackFrame::CalculateExecutionContext (ExecutionContext &exe_ctx) } void -StackFrame::DumpUsingSettingsFormat (Stream *strm) +StackFrame::DumpUsingSettingsFormat (Stream *strm, const char *frame_marker) { if (strm == NULL) return; @@ -1283,6 +1283,10 @@ StackFrame::DumpUsingSettingsFormat (Stream *strm) GetSymbolContext(eSymbolContextEverything); ExecutionContext exe_ctx (shared_from_this()); StreamString s; + + if (frame_marker) + s.PutCString(frame_marker); + const char *frame_format = NULL; Target *target = exe_ctx.GetTargetPtr(); if (target) @@ -1370,13 +1374,14 @@ StackFrame::HasCachedData () const bool StackFrame::GetStatus (Stream& strm, bool show_frame_info, - bool show_source) + bool show_source, + const char *frame_marker) { if (show_frame_info) { strm.Indent(); - DumpUsingSettingsFormat (&strm); + DumpUsingSettingsFormat (&strm, frame_marker); } if (show_source) diff --git a/lldb/source/Target/StackFrameList.cpp b/lldb/source/Target/StackFrameList.cpp index 69309dfae7b6..d95ab972a7ab 100644 --- a/lldb/source/Target/StackFrameList.cpp +++ b/lldb/source/Target/StackFrameList.cpp @@ -863,7 +863,8 @@ StackFrameList::GetStatus (Stream& strm, uint32_t first_frame, uint32_t num_frames, bool show_frame_info, - uint32_t num_frames_with_source) + uint32_t num_frames_with_source, + const char *selected_frame_marker) { size_t num_frames_displayed = 0; @@ -880,15 +881,34 @@ StackFrameList::GetStatus (Stream& strm, else last_frame = first_frame + num_frames; + StackFrameSP selected_frame_sp = m_thread.GetSelectedFrame(); + const char *unselected_marker = NULL; + std::string buffer; + if (selected_frame_marker) + { + size_t len = strlen(selected_frame_marker); + buffer.insert(buffer.begin(), len, ' '); + unselected_marker = buffer.c_str(); + } + const char *marker = NULL; + for (frame_idx = first_frame; frame_idx < last_frame; ++frame_idx) { frame_sp = GetFrameAtIndex(frame_idx); if (frame_sp.get() == NULL) break; + if (selected_frame_marker != NULL) + { + if (frame_sp == selected_frame_sp) + marker = selected_frame_marker; + else + marker = unselected_marker; + } + if (!frame_sp->GetStatus (strm, show_frame_info, - num_frames_with_source > (first_frame - frame_idx))) + num_frames_with_source > (first_frame - frame_idx), marker)) break; ++num_frames_displayed; } diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index df0c143db52d..98c26019b4a1 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -1960,13 +1960,21 @@ Thread::GetStatus (Stream &strm, uint32_t start_frame, uint32_t num_frames, uint strm.IndentMore(); const bool show_frame_info = true; - strm.IndentMore (); + + const char *selected_frame_marker = NULL; + if (num_frames == 1 || (GetID() != GetProcess()->GetThreadList().GetSelectedThread()->GetID())) + strm.IndentMore (); + else + selected_frame_marker = "* "; + num_frames_shown = GetStackFrameList ()->GetStatus (strm, start_frame, num_frames, show_frame_info, - num_frames_with_source); - strm.IndentLess(); + num_frames_with_source, + selected_frame_marker); + if (num_frames == 1) + strm.IndentLess(); strm.IndentLess(); } return num_frames_shown;