Is g_global_var necessarily static? On Linux, we're only seeing 2 static variables when your test expects 3.
> static_names = ['static_var', 'g_global_var', 'static_var'] I'm guessing g_global_var isn't treated as static. On Mon, Apr 25, 2016 at 2:54 PM, Greg Clayton via lldb-commits < lldb-commits@lists.llvm.org> wrote: > Author: gclayton > Date: Mon Apr 25 16:54:10 2016 > New Revision: 267478 > > URL: http://llvm.org/viewvc/llvm-project?rev=267478&view=rev > Log: > Fix StackFrame::GetVariables(...) function that was broken by 261858 when > lambda functions were added to Block::AppendBlockVariables(). The > Stackframe::GetVariables(...) function should get all variables regardless > if they are in scope. > > This wasn't caught by the test suite so I added a test for it. > > > Added: > > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/ > > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile > > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py > > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c > Modified: > lldb/trunk/source/Target/StackFrame.cpp > > Added: > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile?rev=267478&view=auto > > ============================================================================== > --- > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile > (added) > +++ > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/Makefile > Mon Apr 25 16:54:10 2016 > @@ -0,0 +1,5 @@ > +LEVEL = ../../../make > + > +C_SOURCES := main.c > + > +include $(LEVEL)/Makefile.rules > > Added: > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py?rev=267478&view=auto > > ============================================================================== > --- > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py > (added) > +++ > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/TestGetVariables.py > Mon Apr 25 16:54:10 2016 > @@ -0,0 +1,190 @@ > +""" > +Test that SBFrame::GetVariables() calls work correctly. > +""" > + > +from __future__ import print_function > + > + > + > +import os, time > +import lldb > +from lldbsuite.test.decorators import * > +from lldbsuite.test.lldbtest import * > +from lldbsuite.test import lldbplatform > +from lldbsuite.test import lldbutil > + > +def get_names_from_value_list(value_list): > + names = list() > + for value in value_list: > + names.append(value.GetName()) > + return names > + > +class TestGetVariables(TestBase): > + > + mydir = TestBase.compute_mydir(__file__) > + > + def setUp(self): > + # Call super's setUp(). > + TestBase.setUp(self) > + self.source = 'main.c' > + > + def verify_variable_names(self, description, value_list, names): > + copy_names = list(names) > + actual_names = get_names_from_value_list(value_list) > + for name in actual_names: > + if name in copy_names: > + copy_names.remove(name) > + else: > + self.assertTrue(False, "didn't find '%s' in %s" % (name, > copy_names)) > + self.assertEqual(len(copy_names), 0, "%s: we didn't find > variables: %s in value list (%s)" % (description, copy_names, actual_names)) > + > + def test (self): > + self.build () > + > + # Set debugger into synchronous mode > + self.dbg.SetAsync(False) > + > + # Create a target by the debugger. > + exe = os.path.join(os.getcwd(), "a.out") > + target = self.dbg.CreateTarget(exe) > + self.assertTrue(target, VALID_TARGET) > + > + line1 = line_number(self.source, '// breakpoint 1') > + line2 = line_number(self.source, '// breakpoint 2') > + line3 = line_number(self.source, '// breakpoint 3') > + > + breakpoint1 = target.BreakpointCreateByLocation (self.source, > line1); > + breakpoint2 = target.BreakpointCreateByLocation (self.source, > line2); > + breakpoint3 = target.BreakpointCreateByLocation (self.source, > line3); > + > + self.assertTrue(breakpoint1.GetNumLocations() >= 1, > PROCESS_IS_VALID) > + self.assertTrue(breakpoint2.GetNumLocations() >= 1, > PROCESS_IS_VALID) > + self.assertTrue(breakpoint3.GetNumLocations() >= 1, > PROCESS_IS_VALID) > + > + # Register our shared libraries for remote targets so they get > automatically uploaded > + arguments = None > + environment = None > + > + # Now launch the process, and do not stop at entry point. > + process = target.LaunchSimple (arguments, environment, > self.get_process_working_directory()) > + self.assertTrue(process, PROCESS_IS_VALID) > + > + threads = lldbutil.get_threads_stopped_at_breakpoint (process, > breakpoint1) > + self.assertEqual(len(threads), 1, "There should be a thread > stopped at breakpoint 1") > + > + thread = threads[0] > + self.assertTrue(thread.IsValid(), "Thread must be valid") > + frame = thread.GetFrameAtIndex(0) > + self.assertTrue(frame.IsValid(), "Frame must be valid") > + > + arg_names = ['argc', 'argv'] > + local_names = ['i', 'j', 'k'] > + static_names = ['static_var', 'g_global_var', 'static_var'] > + breakpoint1_locals = ['i'] > + breakpoint1_statics = ['static_var'] > + num_args = len(arg_names) > + num_locals = len(local_names) > + num_statics = len(static_names) > + args_yes = True > + args_no = False > + locals_yes = True > + locals_no = False > + statics_yes = True > + statics_no = False > + in_scopy_only = True > + ignore_scope = False > + > + # Verify if we ask for only arguments that we got what we expect > + vars = frame.GetVariables(args_yes, locals_no, statics_no, > ignore_scope) > + self.assertEqual(vars.GetSize(), num_args, "There should be %i > arguments, but we are reporting %i" % (num_args, vars.GetSize())) > + self.verify_variable_names("check names of arguments", vars, > arg_names) > + self.assertEqual(len(arg_names), num_args, "make sure > verify_variable_names() didn't mutate list") > + > + # Verify if we ask for only locals that we got what we expect > + vars = frame.GetVariables(args_no, locals_yes, statics_no, > ignore_scope) > + self.assertEqual(vars.GetSize(), num_locals, "There should be %i > local variables, but we are reporting %i" % (num_locals, vars.GetSize())) > + self.verify_variable_names("check names of locals", vars, > local_names) > + > + # Verify if we ask for only statics that we got what we expect > + vars = frame.GetVariables(args_no, locals_no, statics_yes, > ignore_scope) > + print('statics: ', str(vars)) > + self.assertEqual(vars.GetSize(), num_statics, "There should be %i > static variables, but we are reporting %i" % (num_statics, vars.GetSize())) > + self.verify_variable_names("check names of statics", vars, > static_names) > + > + # Verify if we ask for arguments and locals that we got what we > expect > + vars = frame.GetVariables(args_yes, locals_yes, statics_no, > ignore_scope) > + desc = 'arguments + locals' > + names = arg_names + local_names > + count = len(names) > + self.assertEqual(vars.GetSize(), count, "There should be %i %s > (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), > get_names_from_value_list(vars))) > + self.verify_variable_names("check names of %s" % (desc), vars, > names) > + > + # Verify if we ask for arguments and statics that we got what we > expect > + vars = frame.GetVariables(args_yes, locals_no, statics_yes, > ignore_scope) > + desc = 'arguments + statics' > + names = arg_names + static_names > + count = len(names) > + self.assertEqual(vars.GetSize(), count, "There should be %i %s > (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), > get_names_from_value_list(vars))) > + self.verify_variable_names("check names of %s" % (desc), vars, > names) > + > + # Verify if we ask for locals and statics that we got what we > expect > + vars = frame.GetVariables(args_no, locals_yes, statics_yes, > ignore_scope) > + desc = 'locals + statics' > + names = local_names + static_names > + count = len(names) > + self.assertEqual(vars.GetSize(), count, "There should be %i %s > (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), > get_names_from_value_list(vars))) > + self.verify_variable_names("check names of %s" % (desc), vars, > names) > + > + # Verify if we ask for arguments, locals and statics that we got > what we expect > + vars = frame.GetVariables(args_yes, locals_yes, statics_yes, > ignore_scope) > + desc = 'arguments + locals + statics' > + names = arg_names + local_names + static_names > + count = len(names) > + self.assertEqual(vars.GetSize(), count, "There should be %i %s > (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), > get_names_from_value_list(vars))) > + self.verify_variable_names("check names of %s" % (desc), vars, > names) > + > + # Verify if we ask for in scope locals that we got what we expect > + vars = frame.GetVariables(args_no, locals_yes, statics_no, > in_scopy_only) > + desc = 'in scope locals at breakpoint 1' > + names = ['i'] > + count = len(names) > + self.assertEqual(vars.GetSize(), count, "There should be %i %s > (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), > get_names_from_value_list(vars))) > + self.verify_variable_names("check names of %s" % (desc), vars, > names) > + > + # Continue to breakpoint 2 > + process.Continue() > + > + threads = lldbutil.get_threads_stopped_at_breakpoint (process, > breakpoint2) > + self.assertEqual(len(threads), 1, "There should be a thread > stopped at breakpoint 2") > + > + thread = threads[0] > + self.assertTrue(thread.IsValid(), "Thread must be valid") > + frame = thread.GetFrameAtIndex(0) > + self.assertTrue(frame.IsValid(), "Frame must be valid") > + > + # Verify if we ask for in scope locals that we got what we expect > + vars = frame.GetVariables(args_no, locals_yes, statics_no, > in_scopy_only) > + desc = 'in scope locals at breakpoint 2' > + names = ['i', 'j'] > + count = len(names) > + self.assertEqual(vars.GetSize(), count, "There should be %i %s > (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), > get_names_from_value_list(vars))) > + self.verify_variable_names("check names of %s" % (desc), vars, > names) > + > + # Continue to breakpoint 3 > + process.Continue() > + > + threads = lldbutil.get_threads_stopped_at_breakpoint (process, > breakpoint3) > + self.assertEqual(len(threads), 1, "There should be a thread > stopped at breakpoint 3") > + > + thread = threads[0] > + self.assertTrue(thread.IsValid(), "Thread must be valid") > + frame = thread.GetFrameAtIndex(0) > + self.assertTrue(frame.IsValid(), "Frame must be valid") > + > + # Verify if we ask for in scope locals that we got what we expect > + vars = frame.GetVariables(args_no, locals_yes, statics_no, > in_scopy_only) > + desc = 'in scope locals at breakpoint 3' > + names = ['i', 'j', 'k'] > + count = len(names) > + self.assertEqual(vars.GetSize(), count, "There should be %i %s > (%s) but we are reporting %i (%s)" % (count, desc, names, vars.GetSize(), > get_names_from_value_list(vars))) > + self.verify_variable_names("check names of %s" % (desc), vars, > names) > > Added: > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c?rev=267478&view=auto > > ============================================================================== > --- > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c > (added) > +++ > lldb/trunk/packages/Python/lldbsuite/test/python_api/frame/get-variables/main.c > Mon Apr 25 16:54:10 2016 > @@ -0,0 +1,28 @@ > +//===-- main.c --------------------------------------------------*- C++ > -*-===// > +// > +// The LLVM Compiler Infrastructure > +// > +// This file is distributed under the University of Illinois Open Source > +// License. See LICENSE.TXT for details. > +// > > +//===----------------------------------------------------------------------===// > +#include <stdio.h> > + > +int g_global_var = 123; > +static int g_static_var = 123; > + > +int main (int argc, char const *argv[]) > +{ > + static int static_var = 123; > + int i = 0; // breakpoint 1 > + for (i=0; i<1; ++i) > + { > + int j = i*2; > + printf("i = %i, j = %i\n", i, j); // breakpoint 2 > + { > + int k = i*j*3; > + printf("i = %i, j = %i\n", i, j); // breakpoint 3 > + } > + } > + return 0; > +} > > Modified: lldb/trunk/source/Target/StackFrame.cpp > URL: > http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/StackFrame.cpp?rev=267478&r1=267477&r2=267478&view=diff > > ============================================================================== > --- lldb/trunk/source/Target/StackFrame.cpp (original) > +++ lldb/trunk/source/Target/StackFrame.cpp Mon Apr 25 16:54:10 2016 > @@ -544,7 +544,7 @@ StackFrame::GetVariableList (bool get_fi > frame_block->AppendBlockVariables(can_create, > get_child_variables, > > stop_if_child_block_is_inlined_function, > - [this](Variable* v) { > return v->IsInScope(this); }, > + [this](Variable* v) { > return true; }, > m_variable_list_sp.get()); > } > } > > > _______________________________________________ > lldb-commits mailing list > lldb-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits >
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits