Added some simple testcases for figuring out breakpoints by name in

classes & namespaces.

llvm-svn: 141629
This commit is contained in:
Jim Ingham 2011-10-11 01:43:50 +00:00
parent 44c78f809b
commit 32fc9601a1
3 changed files with 183 additions and 0 deletions

View File

@ -0,0 +1,5 @@
LEVEL = ../../../make
CXX_SOURCES := nested.cpp
include $(LEVEL)/Makefile.rules

View File

@ -0,0 +1,102 @@
"""
Test lldb breakpoint command for CPP methods & functions in a namespace.
"""
import os, time
import unittest2
import lldb
from lldbtest import *
class CPPBreakpointTestCase(TestBase):
mydir = os.path.join("lang", "cpp", "breakpoints")
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
def test_with_dsym(self):
"""Test a sequence of breakpoint command add, list, and delete."""
self.buildDsym()
self.cpp_breakpoints()
def test_with_dwarf(self):
"""Test a sequence of breakpoint command add, list, and delete."""
self.buildDwarf()
self.cpp_breakpoints()
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
def cpp_breakpoints (self):
"""Test a sequence of breakpoint command add, list, and delete."""
exe = os.path.join(os.getcwd(), "a.out")
# Create a target from the debugger.
target = self.dbg.CreateTarget (exe)
self.assertTrue(target, VALID_TARGET)
a_out_module = lldb.SBFileSpecList()
a_out_module.Append(lldb.SBFileSpec(exe))
nested_comp_unit = lldb.SBFileSpecList()
nested_comp_unit.Append (lldb.SBFileSpec("nested.cpp"))
# First provide ONLY the method name. This should get everybody...
auto_break = target.BreakpointCreateByName ("Function",
lldb.eFunctionNameTypeAuto,
a_out_module,
nested_comp_unit)
self.assertTrue (auto_break.GetNumLocations() == 5)
# Now add the Baz class specifier. This should get the version contained in Bar,
# AND the one contained in ::
auto_break = target.BreakpointCreateByName ("Baz::Function",
lldb.eFunctionNameTypeAuto,
a_out_module,
nested_comp_unit)
self.assertTrue (auto_break.GetNumLocations() == 2)
# Then add the Bar::Baz specifier. This should get the version contained in Bar only
auto_break = target.BreakpointCreateByName ("Bar::Baz::Function",
lldb.eFunctionNameTypeAuto,
a_out_module,
nested_comp_unit)
self.assertTrue (auto_break.GetNumLocations() == 1)
plain_method_break = target.BreakpointCreateByName ("Function",
lldb.eFunctionNameTypeMethod,
a_out_module,
nested_comp_unit)
self.assertTrue (plain_method_break.GetNumLocations() == 3)
plain_method_break = target.BreakpointCreateByName ("Baz::Function",
lldb.eFunctionNameTypeMethod,
a_out_module,
nested_comp_unit)
self.assertTrue (plain_method_break.GetNumLocations() == 2)
plain_method_break = target.BreakpointCreateByName ("Bar::Baz::Function",
lldb.eFunctionNameTypeMethod,
a_out_module,
nested_comp_unit)
self.assertTrue (plain_method_break.GetNumLocations() == 1)
plain_method_break = target.BreakpointCreateByName ("Function",
lldb.eFunctionNameTypeBase,
a_out_module,
nested_comp_unit)
self.assertTrue (plain_method_break.GetNumLocations() == 2)
plain_method_break = target.BreakpointCreateByName ("Bar::Function",
lldb.eFunctionNameTypeBase,
a_out_module,
nested_comp_unit)
self.assertTrue (plain_method_break.GetNumLocations() == 1)
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()

View File

@ -0,0 +1,76 @@
#include <stdio.h>
namespace Foo
{
namespace Bar
{
class Baz
{
public:
Baz (int value):m_value(value) {}
int Function ()
{
printf ("%s returning: %d.\n", __FUNCTION__, m_value);
return m_value;
}
private:
int m_value;
};
class Baz2
{
public:
Baz2 (int value):m_value(value) {}
int Function ()
{
printf ("%s returning: %d.\n", __FUNCTION__, m_value);
return m_value;
}
private:
int m_value;
};
static int bar_value = 20;
int Function ()
{
printf ("%s returning: %d.\n", __FUNCTION__, bar_value);
return bar_value;
}
}
}
class Baz
{
public:
Baz (int value):m_value(value) {}
int Function ()
{
printf ("%s returning: %d.\n", __FUNCTION__, m_value);
return m_value;
}
private:
int m_value;
};
int
Function ()
{
printf ("I am a global function, I return 333.\n");
return 333;
}
int main ()
{
Foo::Bar::Baz mine(200);
Foo::Bar::Baz2 mine2(300);
::Baz bare_baz (500);
printf ("Yup, got %d from Baz.\n", mine.Function());
printf ("Yup, got %d from Baz.\n", mine2.Function());
printf ("Yup, got %d from Baz.\n", bare_baz.Function());
printf ("And got %d from Bar.\n", Foo::Bar::Function());
printf ("And got %d from ::.\n", ::Function());
return 0;
}