[Lldb-commits] [lldb] r145050 - in /lldb/trunk: include/lldb/Core/Debugger.h source/Core/Debugger.cpp source/Target/StackFrame.cpp

Greg Clayton gclayton at apple.com
Mon Nov 21 13:44:34 PST 2011


Author: gclayton
Date: Mon Nov 21 15:44:34 2011
New Revision: 145050

URL: http://llvm.org/viewvc/llvm-project?rev=145050&view=rev
Log:
Many GDB users always want to display disassembly when they stop by using 
something like "display/4i $pc" (or something like this). With LLDB we already
were showing 3 lines of source before and 3 lines of source after the current
source line when showing a stop context. We now improve this by allowing the
user to control the number of lines with the new "stop-line-count-before" and
"stop-line-count-after" settings. Also, there is a new setting for how many
disassembly lines to show: "stop-disassembly-count". This will control how many
source lines are shown when there is no source or when we have no source line
info. 

settings set stop-line-count-before 3
settings set stop-line-count-after 3
settings set stop-disassembly-count 4
settings set stop-disassembly-display no-source

The default values are set as shown above and allow 3 lines of source before 
and after (what we used to do) the current stop location, and will display 4 
lines of disassembly if the source is not available or if we have no debug
info. If both "stop-source-context-before" and "stop-source-context-after" are
set to zero, this will disable showing any source when stopped. The 
"stop-disassembly-display" setting is an enumeration that allows you to control
when to display disassembly. It has 3 possible values:

"never" - never show disassembly no matter what
"no-source" - only show disassembly when there is no source line info or the source files are missing
"always" - always show disassembly.


Modified:
    lldb/trunk/include/lldb/Core/Debugger.h
    lldb/trunk/source/Core/Debugger.cpp
    lldb/trunk/source/Target/StackFrame.cpp

Modified: lldb/trunk/include/lldb/Core/Debugger.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Debugger.h?rev=145050&r1=145049&r2=145050&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Debugger.h (original)
+++ lldb/trunk/include/lldb/Core/Debugger.h Mon Nov 21 15:44:34 2011
@@ -44,6 +44,14 @@
 {
 public:
     
+    enum StopDisassemblyType
+    {
+        eStopDisassemblyTypeNever = 0,
+        eStopDisassemblyTypeNoSource,
+        eStopDisassemblyTypeAlways
+    };
+    
+
     DebuggerInstanceSettings (UserSettingsController &owner, bool live_instance = true, const char *name = NULL);
 
     DebuggerInstanceSettings (const DebuggerInstanceSettings &rhs);
@@ -81,6 +89,44 @@
     {
         m_term_width = term_width;
     }
+
+    uint32_t
+    GetStopSourceLineCount (bool before) const
+    {
+        if (before)
+            return m_stop_source_before_count;
+        else
+            return m_stop_source_after_count;
+    }
+
+    
+    void
+    SetStopSourceLineCount (bool before, uint32_t n)
+    {
+        if (before)
+            m_stop_source_before_count = n;
+        else
+            m_stop_source_after_count = n;
+    }
+
+    StopDisassemblyType
+    GetStopDisassemblyDisplay () const
+    {
+        return m_stop_disassembly_display;
+    }
+    
+
+    uint32_t
+    GetDisassemblyLineCount () const
+    {
+        return m_stop_disassembly_count;
+    }
+    
+    void
+    SetDisassemblyLineCount (uint32_t n)
+    {
+        m_stop_disassembly_count = n;
+    }
     
     const char *
     GetPrompt() const
@@ -169,7 +215,7 @@
     {
         m_auto_confirm_on = auto_confirm_on;
     }
-        
+    
 protected:
 
     void
@@ -185,30 +231,15 @@
     const ConstString
     CreateInstanceName ();
 
-    static const ConstString &
-    PromptVarName ();
-
-    static const ConstString &
-    GetFrameFormatName ();
-
-    static const ConstString &
-    GetThreadFormatName ();
-
-    static const ConstString &
-    ScriptLangVarName ();
-  
-    static const ConstString &
-    TermWidthVarName ();
-  
-    static const ConstString &
-    UseExternalEditorVarName ();
-    
-    static const ConstString &
-    AutoConfirmName ();
+    static OptionEnumValueElement g_show_disassembly_enum_values[];
 
 private:
 
     uint32_t m_term_width;
+    uint32_t m_stop_source_before_count;
+    uint32_t m_stop_source_after_count;
+    uint32_t m_stop_disassembly_count;
+    StopDisassemblyType m_stop_disassembly_display;
     std::string m_prompt;
     std::string m_frame_format;
     std::string m_thread_format;

Modified: lldb/trunk/source/Core/Debugger.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=145050&r1=145049&r2=145050&view=diff
==============================================================================
--- lldb/trunk/source/Core/Debugger.cpp (original)
+++ lldb/trunk/source/Core/Debugger.cpp Mon Nov 21 15:44:34 2011
@@ -61,6 +61,94 @@
 }
 
 
+static const ConstString &
+PromptVarName ()
+{
+    static ConstString g_const_string ("prompt");
+    return g_const_string;
+}
+
+static const ConstString &
+GetFrameFormatName ()
+{
+    static ConstString g_const_string ("frame-format");
+    return g_const_string;
+}
+
+static const ConstString &
+GetThreadFormatName ()
+{
+    static ConstString g_const_string ("thread-format");
+    return g_const_string;
+}
+
+static const ConstString &
+ScriptLangVarName ()
+{
+    static ConstString g_const_string ("script-lang");
+    return g_const_string;
+}
+
+static const ConstString &
+TermWidthVarName ()
+{
+    static ConstString g_const_string ("term-width");
+    return g_const_string;
+}
+
+static const ConstString &
+UseExternalEditorVarName ()
+{
+    static ConstString g_const_string ("use-external-editor");
+    return g_const_string;
+}
+
+static const ConstString &
+AutoConfirmName ()
+{
+    static ConstString g_const_string ("auto-confirm");
+    return g_const_string;
+}
+
+static const ConstString &
+StopSourceContextBeforeName ()
+{
+    static ConstString g_const_string ("stop-line-count-before");
+    return g_const_string;
+}
+
+static const ConstString &
+StopSourceContextAfterName ()
+{
+    static ConstString g_const_string ("stop-line-count-after");
+    return g_const_string;
+}
+
+static const ConstString &
+StopDisassemblyCountName ()
+{
+    static ConstString g_const_string ("stop-disassembly-count");
+    return g_const_string;
+}
+
+static const ConstString &
+StopDisassemblyDisplayName ()
+{
+    static ConstString g_const_string ("stop-disassembly-display");
+    return g_const_string;
+}
+
+OptionEnumValueElement
+DebuggerInstanceSettings::g_show_disassembly_enum_values[] =
+{
+    { eStopDisassemblyTypeNever,    "never",     "Never show disassembly when displaying a stop context."},
+    { eStopDisassemblyTypeNoSource, "no-source", "Show disassembly when there is no source information, or the source file is missing when displaying a stop context."},
+    { eStopDisassemblyTypeAlways,   "always",    "Always show disassembly when displaying a stop context."},
+    { 0, NULL, NULL }
+};
+
+
+
 #pragma mark Debugger
 
 UserSettingsControllerSP &
@@ -2108,6 +2196,10 @@
 ) :
     InstanceSettings (owner, name ? name : InstanceSettings::InvalidName().AsCString(), live_instance),
     m_term_width (80),
+    m_stop_source_before_count (3),
+    m_stop_source_after_count (3),
+    m_stop_disassembly_count (4),
+    m_stop_disassembly_display (eStopDisassemblyTypeNoSource),
     m_prompt (),
     m_frame_format (),
     m_thread_format (),    
@@ -2255,6 +2347,37 @@
     {
         UserSettingsController::UpdateBooleanVariable (op, m_auto_confirm_on, value, false, err);
     }
+    else if (var_name == StopSourceContextBeforeName ())
+    {
+        uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL);
+        if (new_value != UINT32_MAX)
+            m_stop_source_before_count = new_value;
+        else
+            err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopSourceContextAfterName ().GetCString());
+    }
+    else if (var_name == StopSourceContextAfterName ())
+    {
+        uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL);
+        if (new_value != UINT32_MAX)
+            m_stop_source_after_count = new_value;
+        else
+            err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopSourceContextBeforeName ().GetCString());
+    }
+    else if (var_name == StopDisassemblyCountName ())
+    {
+        uint32_t new_value = Args::StringToUInt32(value, UINT32_MAX, 10, NULL);
+        if (new_value != UINT32_MAX)
+            m_stop_disassembly_count = new_value;
+        else
+            err.SetErrorStringWithFormat("invalid unsigned string value '%s' for the '%s' setting", value, StopDisassemblyCountName ().GetCString());
+    }
+    else if (var_name == StopDisassemblyDisplayName ())
+    {
+        int new_value;
+        UserSettingsController::UpdateEnumVariable (g_show_disassembly_enum_values, &new_value, value, err);
+        if (err.Success())
+            m_stop_disassembly_display = (StopDisassemblyType)new_value;
+    }
 }
 
 bool
@@ -2275,7 +2398,7 @@
     else if (var_name == TermWidthVarName())
     {
         StreamString width_str;
-        width_str.Printf ("%d", m_term_width);
+        width_str.Printf ("%u", m_term_width);
         value.AppendString (width_str.GetData());
     }
     else if (var_name == GetFrameFormatName ())
@@ -2300,6 +2423,31 @@
         else
             value.AppendString ("false");
     }
+    else if (var_name == StopSourceContextAfterName ())
+    {
+        StreamString strm;
+        strm.Printf ("%u", m_stop_source_before_count);
+        value.AppendString (strm.GetData());
+    }
+    else if (var_name == StopSourceContextBeforeName ())
+    {
+        StreamString strm;
+        strm.Printf ("%u", m_stop_source_after_count);
+        value.AppendString (strm.GetData());
+    }
+    else if (var_name == StopDisassemblyCountName ())
+    {
+        StreamString strm;
+        strm.Printf ("%u", m_stop_disassembly_count);
+        value.AppendString (strm.GetData());
+    }
+    else if (var_name == StopDisassemblyDisplayName ())
+    {
+        if (m_stop_disassembly_display >= eStopDisassemblyTypeNever && m_stop_disassembly_display <= eStopDisassemblyTypeAlways)
+            value.AppendString (g_show_disassembly_enum_values[m_stop_disassembly_display].string_value);
+        else
+            value.AppendString ("<invalid>");
+    }
     else
     {
         if (err)
@@ -2391,61 +2539,6 @@
     return ret_val;
 }
 
-const ConstString &
-DebuggerInstanceSettings::PromptVarName ()
-{
-    static ConstString prompt_var_name ("prompt");
-
-    return prompt_var_name;
-}
-
-const ConstString &
-DebuggerInstanceSettings::GetFrameFormatName ()
-{
-    static ConstString prompt_var_name ("frame-format");
-
-    return prompt_var_name;
-}
-
-const ConstString &
-DebuggerInstanceSettings::GetThreadFormatName ()
-{
-    static ConstString prompt_var_name ("thread-format");
-
-    return prompt_var_name;
-}
-
-const ConstString &
-DebuggerInstanceSettings::ScriptLangVarName ()
-{
-    static ConstString script_lang_var_name ("script-lang");
-
-    return script_lang_var_name;
-}
-
-const ConstString &
-DebuggerInstanceSettings::TermWidthVarName ()
-{
-    static ConstString term_width_var_name ("term-width");
-
-    return term_width_var_name;
-}
-
-const ConstString &
-DebuggerInstanceSettings::UseExternalEditorVarName ()
-{
-    static ConstString use_external_editor_var_name ("use-external-editor");
-
-    return use_external_editor_var_name;
-}
-
-const ConstString &
-DebuggerInstanceSettings::AutoConfirmName ()
-{
-    static ConstString use_external_editor_var_name ("auto-confirm");
-
-    return use_external_editor_var_name;
-}
 
 //--------------------------------------------------
 // SettingsController Variable Tables
@@ -2495,7 +2588,11 @@
 {   "script-lang",          eSetVarTypeString,      "python",               NULL, false, false, "The script language to be used for evaluating user-written scripts." },
 {   "term-width",           eSetVarTypeInt,         "80"    ,               NULL, false, false, "The maximum number of columns to use for displaying text." },
 {   "thread-format",        eSetVarTypeString,      DEFAULT_THREAD_FORMAT,  NULL, false, false, "The default thread format string to use when displaying thread information." },
-{   "use-external-editor",  eSetVarTypeBoolean,        "false",                NULL, false, false, "Whether to use an external editor or not." },
-{   "auto-confirm",         eSetVarTypeBoolean,        "false",                NULL, false, false, "If true all confirmation prompts will receive their default reply." },
+{   "use-external-editor",  eSetVarTypeBoolean,     "false",                NULL, false, false, "Whether to use an external editor or not." },
+{   "auto-confirm",         eSetVarTypeBoolean,     "false",                NULL, false, false, "If true all confirmation prompts will receive their default reply." },
+{   "stop-line-count-before",eSetVarTypeInt,        "3",                    NULL, false, false, "The number of sources lines to display that come before the current source line when displaying a stopped context." },
+{   "stop-line-count-after", eSetVarTypeInt,        "3",                    NULL, false, false, "The number of sources lines to display that come after the current source line when displaying a stopped context." },
+{   "stop-disassembly-count",  eSetVarTypeInt,      "0",                    NULL, false, false, "The number of disassembly lines to show when displaying a stopped context." },
+{   "stop-disassembly-display", eSetVarTypeEnum,    "no-source",           g_show_disassembly_enum_values, false, false, "Control when to display disassembly when displaying a stopped context." },
 {   NULL,                   eSetVarTypeNone,        NULL,                   NULL, false, false, NULL }
 };

Modified: lldb/trunk/source/Target/StackFrame.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?rev=145050&r1=145049&r2=145050&view=diff
==============================================================================
--- lldb/trunk/source/Target/StackFrame.cpp (original)
+++ lldb/trunk/source/Target/StackFrame.cpp Mon Nov 21 15:44:34 2011
@@ -1270,19 +1270,62 @@
     
     if (show_source)
     {
-        GetSymbolContext(eSymbolContextCompUnit | eSymbolContextLineEntry);
-    
-        if (m_sc.comp_unit && m_sc.line_entry.IsValid())
+        Target &target = GetThread().GetProcess().GetTarget();
+        Debugger &debugger = target.GetDebugger();
+        const uint32_t source_before = debugger.GetStopSourceLineCount(true);
+        const uint32_t source_after = debugger.GetStopSourceLineCount(false);
+        bool have_source = false;
+        if (source_before || source_after)
         {
-            Target &target = GetThread().GetProcess().GetTarget();
-            target.GetSourceManager().DisplaySourceLinesWithLineNumbers (
-                m_sc.line_entry.file,
-                m_sc.line_entry.line,
-                3,
-                3,
-                "->",
-                &strm);
+            GetSymbolContext(eSymbolContextCompUnit | eSymbolContextLineEntry);
+
+            if (m_sc.comp_unit && m_sc.line_entry.IsValid())
+            {
+                if (target.GetSourceManager().DisplaySourceLinesWithLineNumbers (m_sc.line_entry.file,
+                                                                                 m_sc.line_entry.line,
+                                                                                 source_before,
+                                                                                 source_after,
+                                                                                 "->",
+                                                                                 &strm))
+                {
+                    have_source = true;
+                }
+            }
+        }
+        DebuggerInstanceSettings::StopDisassemblyType disasm_display = debugger.GetStopDisassemblyDisplay ();
         
+        switch (disasm_display)
+        {
+        case DebuggerInstanceSettings::eStopDisassemblyTypeNever:
+            break;
+
+        case DebuggerInstanceSettings::eStopDisassemblyTypeNoSource:
+            if (have_source)
+                break;
+            // Fall through to next case
+        case DebuggerInstanceSettings::eStopDisassemblyTypeAlways:
+            {
+                const uint32_t disasm_lines = debugger.GetDisassemblyLineCount();
+                if (disasm_lines > 0)
+                {
+                    const ArchSpec &target_arch = target.GetArchitecture();
+                    AddressRange pc_range;
+                    pc_range.GetBaseAddress() = GetFrameCodeAddress();
+                    pc_range.SetByteSize(disasm_lines * target_arch.GetMaximumOpcodeByteSize());
+                    ExecutionContext exe_ctx;
+                    CalculateExecutionContext(exe_ctx);
+                    Disassembler::Disassemble (debugger,
+                                               target_arch,
+                                               NULL,
+                                               exe_ctx,
+                                               pc_range,
+                                               disasm_lines,
+                                               0,
+                                               Disassembler::eOptionMarkPCAddress,
+                                               strm);
+                }
+            }
+            break;
         }
     }
     return true;





More information about the lldb-commits mailing list