[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
Chaoren Lin via lldb-commits
lldb-commits at lists.llvm.org
Thu Feb 25 18:51:50 PST 2016
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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160226/6f17c321/attachment-0001.html>
More information about the lldb-commits
mailing list