[Lldb-commits] [lldb] r261953 - Add the "block" keyword to "thread step-in -e", and an alias that uses it: "sif <target function>" - i.e. step-into-function

Jason Molenda via lldb-commits lldb-commits at lists.llvm.org
Thu Feb 25 18:55:55 PST 2016


Jim just headed home - if you don't mind, please revert the commit.  He'll look into it tomorrow morning.

J


> On Feb 25, 2016, at 6:51 PM, Chaoren Lin via lldb-commits <lldb-commits at lists.llvm.org> wrote:
> 
> Hi Jim,
> 
> This broke a lot of our tests on Linux. E.g., "p foo" doesn't work.
> http://lab.llvm.org:8011/builders/lldb-x86_64-ubuntu-14.04-cmake/builds/11803
> 
> Since the breakage is pretty severe, mind if I revert this first until the problem can be fixed?
> 
> On Thu, Feb 25, 2016 at 5:42 PM Jim Ingham via lldb-commits <lldb-commits at lists.llvm.org> wrote:
> Author: jingham
> Date: Thu Feb 25 19:37:30 2016
> New Revision: 261953
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=261953&view=rev
> Log:
> Add the "block" keyword to "thread step-in -e", and an alias that uses it: "sif <target function>" - i.e. step-into-function
> to allow you to step through a complex calling sequence into a particular function that may span multiple lines.  Also some
> test cases for this and the --step-target feature.
> 
> 
> Added:
>     lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/
>     lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/Makefile
>     lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/TestStepTarget.py
>     lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/main.c
> Modified:
>     lldb/trunk/source/Commands/CommandObjectThread.cpp
>     lldb/trunk/source/Interpreter/CommandInterpreter.cpp
> 
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/Makefile
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/Makefile?rev=261953&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/Makefile (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/Makefile Thu Feb 25 19:37:30 2016
> @@ -0,0 +1,5 @@
> +LEVEL = ../../../make
> +
> +C_SOURCES := main.c
> +
> +include $(LEVEL)/Makefile.rules
> 
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/TestStepTarget.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/TestStepTarget.py?rev=261953&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/TestStepTarget.py (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/TestStepTarget.py Thu Feb 25 19:37:30 2016
> @@ -0,0 +1,113 @@
> +"""Test the 'step target' feature."""
> +
> +from __future__ import print_function
> +
> +import os, time
> +import lldb
> +from lldbsuite.test.decorators import *
> +from lldbsuite.test.lldbtest import *
> +from lldbsuite.test import lldbutil
> +
> +class TestStepTarget(TestBase):
> +
> +    mydir = TestBase.compute_mydir(__file__)
> +
> +    def getCategories(self):
> +        return ['basic_process']
> +
> +    def setUp(self):
> +        # Call super's setUp().
> +        TestBase.setUp(self)
> +        # Find the line numbers that we will step to in main:
> +        self.main_source = "main.c"
> +        self.end_line = line_number(self.main_source, "All done")
> +
> +    @add_test_categories(['pyapi'])
> +
> +    def get_to_start (self):
> +        self.build()
> +        exe = os.path.join(os.getcwd(), "a.out")
> +
> +        target = self.dbg.CreateTarget(exe)
> +        self.assertTrue(target, VALID_TARGET)
> +
> +        self.main_source_spec = lldb.SBFileSpec (self.main_source)
> +
> +        break_in_main = target.BreakpointCreateBySourceRegex ('Break here to try targetted stepping', self.main_source_spec)
> +        self.assertTrue(break_in_main, VALID_BREAKPOINT)
> +        self.assertTrue(break_in_main.GetNumLocations() > 0,"Has locations.")
> +
> +        # Now launch the process, and do not stop at entry point.
> +        process = target.LaunchSimple (None, None, self.get_process_working_directory())
> +
> +        self.assertTrue(process, PROCESS_IS_VALID)
> +
> +        # The stop reason of the thread should be breakpoint.
> +        threads = lldbutil.get_threads_stopped_at_breakpoint (process, break_in_main)
> +
> +        if len(threads) != 1:
> +            self.fail ("Failed to stop at first breakpoint in main.")
> +
> +        thread = threads[0]
> +        return thread
> +
> +    def test_with_end_line(self):
> +        """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
> +
> +        thread = self.get_to_start()
> +
> +        error = lldb.SBError()
> +        thread.StepInto("lotsOfArgs", self.end_line, error)
> +        frame = thread.frames[0]
> +
> +        self.assertTrue (frame.name == "lotsOfArgs", "Stepped to lotsOfArgs.")
> +
> +    def test_with_end_line_bad_name(self):
> +        """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
> +
> +        thread = self.get_to_start()
> +
> +        error = lldb.SBError()
> +        thread.StepInto("lotsOfArgssss", self.end_line, error)
> +        frame = thread.frames[0]
> +        self.assertTrue (frame.line_entry.line == self.end_line, "Stepped to the block end.")
> +
> +    def test_with_end_line_deeper(self):
> +        """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
> +
> +        thread = self.get_to_start()
> +
> +        error = lldb.SBError()
> +        thread.StepInto("modifyInt", self.end_line, error)
> +        frame = thread.frames[0]
> +        self.assertTrue (frame.name == "modifyInt", "Stepped to modifyInt.")
> +
> +    def test_with_command_and_block(self):
> +        """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
> +
> +        thread = self.get_to_start()
> +
> +        result = lldb.SBCommandReturnObject()
> +        self.dbg.GetCommandInterpreter().HandleCommand('thread step-in -t "lotsOfArgs" -e block', result)
> +        self.assertTrue(result.Succeeded(), "thread step-in command succeeded.")
> +
> +        frame = thread.frames[0]
> +        self.assertTrue (frame.name == "lotsOfArgs", "Stepped to lotsOfArgs.")
> +
> +    def test_with_command_and_block_and_bad_name(self):
> +        """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
> +
> +        thread = self.get_to_start()
> +
> +        result = lldb.SBCommandReturnObject()
> +        self.dbg.GetCommandInterpreter().HandleCommand('thread step-in -t "lotsOfArgsssss" -e block', result)
> +        self.assertTrue(result.Succeeded(), "thread step-in command succeeded.")
> +
> +        frame = thread.frames[0]
> +
> +        self.assertTrue (frame.name == "main", "Stepped back out to main.")
> +        # end_line is set to the line after the containing block.  Check that we got there:
> +        self.assertTrue(frame.line_entry.line == self.end_line, "Got out of the block")
> +
> +
> +
> 
> Added: lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/main.c
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/main.c?rev=261953&view=auto
> ==============================================================================
> --- lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/main.c (added)
> +++ lldb/trunk/packages/Python/lldbsuite/test/lang/c/step-target/main.c Thu Feb 25 19:37:30 2016
> @@ -0,0 +1,40 @@
> +#include <stdio.h>
> +
> +void
> +lotsOfArgs
> +(
> +  int firstArg,
> +  int secondArg,
> +  int thirdArg,
> +  int fourthArg
> +)
> +{
> +  printf ("First: %d Second: %d Third: %d Fourth: %d.\n",
> +          firstArg,
> +          secondArg,
> +          thirdArg,
> +          fourthArg);
> +}
> +
> +int
> +modifyInt(int incoming)
> +{
> +  return incoming % 2;
> +}
> +
> +int
> +main (int argc, char **argv)
> +{
> +  if (argc > 0)
> +    {
> +      int var_makes_block = argc + 1;
> +      printf ("Break here to try targetted stepping.\n");
> +      lotsOfArgs(var_makes_block,
> +                 modifyInt(20),
> +                 30,
> +                 modifyInt(40));
> +      printf ("Done calling lotsOfArgs.");
> +    }
> +  printf ("All done.\n");
> +  return 0;
> +}
> 
> Modified: lldb/trunk/source/Commands/CommandObjectThread.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectThread.cpp?rev=261953&r1=261952&r2=261953&view=diff
> ==============================================================================
> --- lldb/trunk/source/Commands/CommandObjectThread.cpp (original)
> +++ lldb/trunk/source/Commands/CommandObjectThread.cpp Thu Feb 25 19:37:30 2016
> @@ -386,6 +386,11 @@ public:
> 
>              case 'e':
>                  {
> +                    if (strcmp(option_arg, "block") == 0)
> +                    {
> +                        m_end_line_is_block_end = 1;
> +                        break;
> +                    }
>                      uint32_t tmp_end_line = StringConvert::ToUInt32(option_arg, UINT32_MAX, 0);
>                      if (tmp_end_line == UINT32_MAX)
>                         error.SetErrorStringWithFormat ("invalid end line number '%s'", option_arg);
> @@ -429,6 +434,7 @@ public:
>              m_class_name.clear();
>              m_step_count = 1;
>              m_end_line = LLDB_INVALID_LINE_NUMBER;
> +            m_end_line_is_block_end = false;
>          }
> 
>          const OptionDefinition*
> @@ -450,6 +456,7 @@ public:
>          std::string m_class_name;
>          uint32_t m_step_count;
>          uint32_t m_end_line;
> +        bool     m_end_line_is_block_end;
>      };
> 
>      CommandObjectThreadStepWithTypeAndScope (CommandInterpreter &interpreter,
> @@ -588,6 +595,30 @@ protected:
>                          return false;
>                      }
>                  }
> +                else if (m_options.m_end_line_is_block_end)
> +                {
> +                    Error error;
> +                    Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
> +                    if (!block)
> +                    {
> +                        result.AppendErrorWithFormat("Could not find the current block.");
> +                        result.SetStatus(eReturnStatusFailed);
> +                        return false;
> +                    }
> +
> +                    AddressRange block_range;
> +                    Address pc_address = frame->GetFrameCodeAddress();
> +                    block->GetRangeContainingAddress(pc_address, block_range);
> +                    if (!block_range.GetBaseAddress().IsValid())
> +                    {
> +                        result.AppendErrorWithFormat("Could not find the current block address.");
> +                        result.SetStatus(eReturnStatusFailed);
> +                        return false;
> +                    }
> +                    lldb::addr_t pc_offset_in_block = pc_address.GetFileAddress() - block_range.GetBaseAddress().GetFileAddress();
> +                    lldb::addr_t range_length = block_range.GetByteSize() - pc_offset_in_block;
> +                    range = AddressRange(pc_address, range_length);
> +                }
>                  else
>                  {
>                      range = sc.line_entry.range;
> @@ -741,7 +772,9 @@ CommandObjectThreadStepWithTypeAndScope:
>  { LLDB_OPT_SET_1, false, "step-in-avoids-no-debug",   'a', OptionParser::eRequiredArgument, nullptr, nullptr,               0, eArgTypeBoolean,     "A boolean value that sets whether stepping into functions will step over functions with no debug information."},
>  { LLDB_OPT_SET_1, false, "step-out-avoids-no-debug",  'A', OptionParser::eRequiredArgument, nullptr, nullptr,               0, eArgTypeBoolean,     "A boolean value, if true stepping out of functions will continue to step out till it hits a function with debug information."},
>  { LLDB_OPT_SET_1, false, "count",                     'c', OptionParser::eRequiredArgument, nullptr, nullptr,               1, eArgTypeCount,     "How many times to perform the stepping operation - currently only supported for step-inst and next-inst."},
> -{ LLDB_OPT_SET_1, false, "end-linenumber",            'e', OptionParser::eRequiredArgument, nullptr, nullptr,               1, eArgTypeLineNum,     "The line at which to stop stepping - defaults to the next line and only supported for step-in and step-over."},
> +{ LLDB_OPT_SET_1, false, "end-linenumber",            'e', OptionParser::eRequiredArgument, nullptr, nullptr,               1, eArgTypeLineNum,     "The line at which to stop stepping - defaults to the next line and only supported for step-in and step-over."
> +                                                                                                                                              "  You can also pass the string 'block' to step to the end of the current block."
> +                                                                                                                                              "  This is particularly useful in conjunction with --step-target to step through a complex calling sequence."},
>  { LLDB_OPT_SET_1, false, "run-mode",                  'm', OptionParser::eRequiredArgument, nullptr, g_tri_running_mode, 0, eArgTypeRunMode, "Determine how to run other threads while stepping the current thread."},
>  { LLDB_OPT_SET_1, false, "step-over-regexp",          'r', OptionParser::eRequiredArgument, nullptr, nullptr,               0, eArgTypeRegularExpression,   "A regular expression that defines function names to not to stop at when stepping in."},
>  { LLDB_OPT_SET_1, false, "step-in-target",            't', OptionParser::eRequiredArgument, nullptr, nullptr,               0, eArgTypeFunctionName,   "The name of the directly called function step in should stop at when stepping into."},
> 
> Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=261953&r1=261952&r2=261953&view=diff
> ==============================================================================
> --- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original)
> +++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Thu Feb 25 19:37:30 2016
> @@ -185,6 +185,9 @@ CommandInterpreter::Initialize ()
> 
>      LoadCommandDictionary ();
> 
> +    // An alias arguments vector to reuse - reset it before use...
> +    OptionArgVectorSP alias_arguments_vector_sp (new OptionArgVector);
> +
>      // Set up some initial aliases.
>      CommandObjectSP cmd_obj_sp = GetCommandSPExact ("quit", false);
>      if (cmd_obj_sp)
> @@ -239,6 +242,11 @@ CommandInterpreter::Initialize ()
>      {
>          AddAlias ("s", cmd_obj_sp);
>          AddAlias ("step", cmd_obj_sp);
> +
> +        alias_arguments_vector_sp.reset (new OptionArgVector);
> +        ProcessAliasOptionsArgs (cmd_obj_sp, "--end-linenumber block --step-in-target %1", alias_arguments_vector_sp);
> +        AddAlias ("sif", cmd_obj_sp);
> +        AddOrReplaceAliasOptions("sif", alias_arguments_vector_sp);
>      }
> 
>      cmd_obj_sp = GetCommandSPExact ("thread step-over", false);
> @@ -329,8 +337,6 @@ CommandInterpreter::Initialize ()
>          AddAlias ("image", cmd_obj_sp);
> 
> 
> -    OptionArgVectorSP alias_arguments_vector_sp (new OptionArgVector);
> -
>      cmd_obj_sp = GetCommandSPExact ("expression", false);
>      if (cmd_obj_sp)
>      {
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits



More information about the lldb-commits mailing list