[Lldb-commits] [lldb] r228370 - Add a "-a/--address" option to "thread until". You can specify one or more line numbers (as arguments)

Jim Ingham jingham at apple.com
Thu Feb 5 18:10:57 PST 2015


Author: jingham
Date: Thu Feb  5 20:10:56 2015
New Revision: 228370

URL: http://llvm.org/viewvc/llvm-project?rev=228370&view=rev
Log:
Add a "-a/--address" option to "thread until".  You can specify one or more line numbers (as arguments)
and/or one or more addresses (with -a) and until will stop at the first one of  thesepoints it hits,
or on exit from the function if you leave the function before hitting any of these stop points.

<rdar://problem/12438270>

Modified:
    lldb/trunk/source/Commands/CommandObjectThread.cpp

Modified: lldb/trunk/source/Commands/CommandObjectThread.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectThread.cpp?rev=228370&r1=228369&r2=228370&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectThread.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectThread.cpp Thu Feb  5 20:10:56 2015
@@ -985,6 +985,14 @@ public:
 
             switch (short_option)
             {
+                case 'a':
+                {
+                    ExecutionContext exe_ctx (m_interpreter.GetExecutionContext());
+                    lldb::addr_t tmp_addr = Args::StringToAddress(&exe_ctx, option_arg, LLDB_INVALID_ADDRESS, &error);
+                    if (error.Success())
+                        m_until_addrs.push_back(tmp_addr);
+                }
+                break;
                 case 't':
                 {
                     m_thread_idx = StringConvert::ToUInt32 (option_arg, LLDB_INVALID_INDEX32);
@@ -1031,6 +1039,7 @@ public:
             m_thread_idx = LLDB_INVALID_THREAD_ID;
             m_frame_idx = 0;
             m_stop_others = false;
+            m_until_addrs.clear();
         }
 
         const OptionDefinition*
@@ -1041,6 +1050,7 @@ public:
 
         uint32_t m_step_thread_idx;
         bool m_stop_others;
+        std::vector<lldb::addr_t> m_until_addrs;
 
         // Options table: Required for subclasses of Options.
 
@@ -1052,7 +1062,7 @@ public:
     CommandObjectThreadUntil (CommandInterpreter &interpreter) :
         CommandObjectParsed (interpreter, 
                              "thread until",
-                             "Run the current or specified thread until it reaches a given line number or leaves the current function.",
+                             "Run the current or specified thread until it reaches a given line number or address or leaves the current function.",
                              NULL,
                              eFlagRequiresThread        |
                              eFlagTryTargetAPILock      |
@@ -1111,23 +1121,33 @@ protected:
         else
         {
             Thread *thread = NULL;
-            uint32_t line_number;
+            std::vector<uint32_t> line_numbers;
 
-            if (command.GetArgumentCount() != 1)
+            if (command.GetArgumentCount() >= 1)
             {
-                result.AppendErrorWithFormat ("No line number provided:\n%s", GetSyntax());
-                result.SetStatus (eReturnStatusFailed);
-                return false;
+                size_t num_args = command.GetArgumentCount();
+                for (size_t i = 0; i < num_args; i++)
+                {
+                    uint32_t line_number;
+                    line_number = StringConvert::ToUInt32 (command.GetArgumentAtIndex(0), UINT32_MAX);
+                    if (line_number == UINT32_MAX)
+                    {
+                        result.AppendErrorWithFormat ("invalid line number: '%s'.\n", command.GetArgumentAtIndex(0));
+                        result.SetStatus (eReturnStatusFailed);
+                        return false;
+                    }
+                    else
+                        line_numbers.push_back(line_number);
+                }
             }
-
-            line_number = StringConvert::ToUInt32 (command.GetArgumentAtIndex(0), UINT32_MAX);
-            if (line_number == UINT32_MAX)
+            else if (m_options.m_until_addrs.empty())
             {
-                result.AppendErrorWithFormat ("invalid line number: '%s'.\n", command.GetArgumentAtIndex(0));
+                result.AppendErrorWithFormat ("No line number or address provided:\n%s", GetSyntax());
                 result.SetStatus (eReturnStatusFailed);
                 return false;
             }
 
+
             if (m_options.m_thread_idx == LLDB_INVALID_THREAD_ID)
             {
                 thread = process->GetThreadList().GetSelectedThread().get();
@@ -1189,27 +1209,40 @@ protected:
 
                 Address fun_end_addr(fun_start_addr.GetSection(), 
                                      fun_start_addr.GetOffset() + fun_addr_range.GetByteSize());
-                line_table->FindLineEntryByAddress (fun_end_addr, function_start, &end_ptr);
 
                 bool all_in_function = true;
-                
-                while (index_ptr <= end_ptr)
-                {
-                    LineEntry line_entry;
-                    const bool exact = false;
-                    index_ptr = sc.comp_unit->FindLineEntry(index_ptr, line_number, sc.comp_unit, exact, &line_entry);
-                    if (index_ptr == UINT32_MAX)
-                        break;
 
-                    addr_t address = line_entry.range.GetBaseAddress().GetLoadAddress(target);
-                    if (address != LLDB_INVALID_ADDRESS)
+                line_table->FindLineEntryByAddress (fun_end_addr, function_start, &end_ptr);
+
+                for (uint32_t line_number : line_numbers)
+                {
+                    uint32_t start_idx_ptr = index_ptr;
+                    while (start_idx_ptr <= end_ptr)
                     {
-                        if (fun_addr_range.ContainsLoadAddress (address, target))
-                            address_list.push_back (address);
-                        else
-                            all_in_function = false;
+                        LineEntry line_entry;
+                        const bool exact = false;
+                        start_idx_ptr = sc.comp_unit->FindLineEntry(start_idx_ptr, line_number, sc.comp_unit, exact, &line_entry);
+                        if (start_idx_ptr == UINT32_MAX)
+                            break;
+
+                        addr_t address = line_entry.range.GetBaseAddress().GetLoadAddress(target);
+                        if (address != LLDB_INVALID_ADDRESS)
+                        {
+                            if (fun_addr_range.ContainsLoadAddress (address, target))
+                                address_list.push_back (address);
+                            else
+                                all_in_function = false;
+                        }
+                        start_idx_ptr++;
                     }
-                    index_ptr++;
+                }
+
+                for (lldb::addr_t address : m_options.m_until_addrs)
+                {
+                    if (fun_addr_range.ContainsLoadAddress (address, target))
+                        address_list.push_back (address);
+                    else
+                        all_in_function = false;
                 }
 
                 if (address_list.size() == 0)
@@ -1291,7 +1324,8 @@ CommandObjectThreadUntil::CommandOptions
 {
 { LLDB_OPT_SET_1, false, "frame",   'f', OptionParser::eRequiredArgument, NULL, NULL,               0, eArgTypeFrameIndex,   "Frame index for until operation - defaults to 0"},
 { LLDB_OPT_SET_1, false, "thread",  't', OptionParser::eRequiredArgument, NULL, NULL,               0, eArgTypeThreadIndex,  "Thread index for the thread for until operation"},
-{ LLDB_OPT_SET_1, false, "run-mode",'m', OptionParser::eRequiredArgument, NULL, g_duo_running_mode, 0, eArgTypeRunMode,"Determine how to run other threads while stepping this one"},
+{ LLDB_OPT_SET_1, false, "run-mode",'m', OptionParser::eRequiredArgument, NULL, g_duo_running_mode, 0, eArgTypeRunMode, "Determine how to run other threads while stepping this one"},
+{ LLDB_OPT_SET_1, false, "address", 'a', OptionParser::eRequiredArgument, NULL, NULL,               0, eArgTypeAddressOrExpression, "Run until we reach the specified address, or leave the function - can be specified multiple times."},
 { 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL }
 };
 





More information about the lldb-commits mailing list