From 9df05592f0e2b570e8045bd415e42c8af5310c99 Mon Sep 17 00:00:00 2001 From: Johnny Chen Date: Mon, 17 Oct 2011 22:17:47 +0000 Subject: [PATCH] Add test cases for setting condition on a watchpoint for both command and API. llvm-svn: 142291 --- .../watchpoint_commands/condition/Makefile | 5 + .../condition/TestWatchpointCmdCondition.py | 91 ---------------- .../watchpoint_commands/condition/main.cpp | 28 +++++ .../default-constructor/sb_watchpoint.py | 2 + .../python_api/watchpoint/condition/Makefile | 5 + .../condition/TestWatchpointConditionAPI.py | 101 ++++++++++++++++++ .../python_api/watchpoint/condition/main.cpp | 28 +++++ 7 files changed, 169 insertions(+), 91 deletions(-) create mode 100644 lldb/test/functionalities/watchpoint/watchpoint_commands/condition/Makefile delete mode 100644 lldb/test/functionalities/watchpoint/watchpoint_commands/condition/TestWatchpointCmdCondition.py create mode 100644 lldb/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp create mode 100644 lldb/test/python_api/watchpoint/condition/Makefile create mode 100644 lldb/test/python_api/watchpoint/condition/TestWatchpointConditionAPI.py create mode 100644 lldb/test/python_api/watchpoint/condition/main.cpp diff --git a/lldb/test/functionalities/watchpoint/watchpoint_commands/condition/Makefile b/lldb/test/functionalities/watchpoint/watchpoint_commands/condition/Makefile new file mode 100644 index 000000000000..ee6b9cc62b40 --- /dev/null +++ b/lldb/test/functionalities/watchpoint/watchpoint_commands/condition/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules diff --git a/lldb/test/functionalities/watchpoint/watchpoint_commands/condition/TestWatchpointCmdCondition.py b/lldb/test/functionalities/watchpoint/watchpoint_commands/condition/TestWatchpointCmdCondition.py deleted file mode 100644 index 7cb3f00ef3d1..000000000000 --- a/lldb/test/functionalities/watchpoint/watchpoint_commands/condition/TestWatchpointCmdCondition.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -Test watchpoint modify command to set condition on a watchpoint. -""" - -import os, time -import unittest2 -import lldb -from lldbtest import * - -class WatchpointCmdConditionTestCase(TestBase): - - mydir = os.path.join("functionalities", "watchpoint", "watchpoint_commands", "condition") - - def setUp(self): - # Call super's setUp(). - TestBase.setUp(self) - # Our simple source filename. - self.source = 'main.cpp' - # Find the line number to break inside main(). - self.line = line_number(self.source, '// Set break point at this line.') - # And the watchpoint variable declaration line number. - self.decl = line_number(self.source, '// Watchpoint variable declaration.') - # Build dictionary to have unique executable names for each test method. - self.exe_name = self.testMethodName - self.d = {'CXX_SOURCES': self.source, 'EXE': self.exe_name} - - @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") - def test_watchpoint_cond_with_dsym(self): - """Test watchpoint condition.""" - self.buildDsym(dictionary=self.d) - self.setTearDownCleanup(dictionary=self.d) - self.watchpoint_condition() - - def test_watchpoint_cond_with_dwarf(self): - """Test watchpoint condition.""" - self.buildDwarf(dictionary=self.d) - self.setTearDownCleanup(dictionary=self.d) - self.watchpoint_condition() - - def watchpoint_condition(self): - """Do watchpoint condition 'global==5'.""" - exe = os.path.join(os.getcwd(), self.exe_name) - self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) - - # Add a breakpoint to set a watchpoint when stopped on the breakpoint. - self.expect("breakpoint set -l %d" % self.line, BREAKPOINT_CREATED, - startstr = "Breakpoint created: 1: file ='%s', line = %d, locations = 1" % - (self.source, self.line)) - - # Run the program. - self.runCmd("run", RUN_SUCCEEDED) - - # We should be stopped again due to the breakpoint. - # The stop reason of the thread should be breakpoint. - self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs = ['stopped', - 'stop reason = breakpoint']) - - # Now let's set a write-type watchpoint for 'global'. - # With a condition of 'global==5'. - self.expect("frame variable -w write -g -L global", WATCHPOINT_CREATED, - substrs = ['Watchpoint created', 'size = 4', 'type = w', - '%s:%d' % (self.source, self.decl)]) - - self.runCmd("watchpoint modify -c 'global==5'") - - # Use the '-v' option to do verbose listing of the watchpoint. - # The hit count should be 0 initially. - self.expect("watchpoint list -v", - substrs = ['hit_count = 0', 'global==5']) - - self.runCmd("process continue") - - # We should be stopped again due to the watchpoint (write type). - # The stop reason of the thread should be watchpoint. - self.expect("thread backtrace", STOPPED_DUE_TO_WATCHPOINT, - substrs = ['stop reason = watchpoint']) - self.expect("frame variable -g global", - substrs = ['(int32_t)', 'global = 5']) - - # Use the '-v' option to do verbose listing of the watchpoint. - # The hit count should now be 2. - self.expect("watchpoint list -v", - substrs = ['hit_count = 5']) - - -if __name__ == '__main__': - import atexit - lldb.SBDebugger.Initialize() - atexit.register(lambda: lldb.SBDebugger.Terminate()) - unittest2.main() diff --git a/lldb/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp b/lldb/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp new file mode 100644 index 000000000000..f4c3527f8af2 --- /dev/null +++ b/lldb/test/functionalities/watchpoint/watchpoint_commands/condition/main.cpp @@ -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 +#include + +int32_t global = 0; // Watchpoint variable declaration. + +static void modify(int32_t &var) { + ++var; +} + +int main(int argc, char** argv) { + int local = 0; + printf("&global=%p\n", &global); + printf("about to write to 'global'...\n"); // Set break point at this line. + // When stopped, watch 'global', + // for the condition "global == 5". + for (int i = 0; i < 10; ++i) + modify(global); + + printf("global=%d\n", global); +} diff --git a/lldb/test/python_api/default-constructor/sb_watchpoint.py b/lldb/test/python_api/default-constructor/sb_watchpoint.py index 29d58628e578..a028cb48c4c3 100644 --- a/lldb/test/python_api/default-constructor/sb_watchpoint.py +++ b/lldb/test/python_api/default-constructor/sb_watchpoint.py @@ -18,3 +18,5 @@ def fuzz_obj(obj): obj.GetIgnoreCount() obj.SetIgnoreCount(5) obj.GetDescription(lldb.SBStream(), lldb.eDescriptionLevelVerbose) + obj.SetCondition("shouldWeStop()") + obj.GetCondition() diff --git a/lldb/test/python_api/watchpoint/condition/Makefile b/lldb/test/python_api/watchpoint/condition/Makefile new file mode 100644 index 000000000000..314f1cb2f077 --- /dev/null +++ b/lldb/test/python_api/watchpoint/condition/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +include $(LEVEL)/Makefile.rules diff --git a/lldb/test/python_api/watchpoint/condition/TestWatchpointConditionAPI.py b/lldb/test/python_api/watchpoint/condition/TestWatchpointConditionAPI.py new file mode 100644 index 000000000000..bfbbc91e6166 --- /dev/null +++ b/lldb/test/python_api/watchpoint/condition/TestWatchpointConditionAPI.py @@ -0,0 +1,101 @@ +""" +Test watchpoint condition API. +""" + +import os, time +import unittest2 +import lldb +import lldbutil +from lldbtest import * + +class WatchpointConditionAPITestCase(TestBase): + + mydir = os.path.join("python_api", "watchpoint", "condition") + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + # Our simple source filename. + self.source = 'main.cpp' + # Find the line number to break inside main(). + self.line = line_number(self.source, '// Set break point at this line.') + # And the watchpoint variable declaration line number. + self.decl = line_number(self.source, '// Watchpoint variable declaration.') + # Build dictionary to have unique executable names for each test method. + self.exe_name = self.testMethodName + self.d = {'CXX_SOURCES': self.source, 'EXE': self.exe_name} + + @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") + def test_watchpoint_cond_api_with_dsym(self): + """Test watchpoint condition API.""" + self.buildDsym(dictionary=self.d) + self.setTearDownCleanup(dictionary=self.d) + self.watchpoint_condition_api() + + def test_watchpoint_cond_api_with_dwarf(self): + """Test watchpoint condition API.""" + self.buildDwarf(dictionary=self.d) + self.setTearDownCleanup(dictionary=self.d) + self.watchpoint_condition_api() + + def watchpoint_condition_api(self): + """Do watchpoint condition API to set condition as 'global==5'.""" + exe = os.path.join(os.getcwd(), self.exe_name) + + # Create a target by the debugger. + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + + # Now create a breakpoint on main.c. + breakpoint = target.BreakpointCreateByLocation(self.source, self.line) + self.assertTrue(breakpoint and + breakpoint.GetNumLocations() == 1, + VALID_BREAKPOINT) + + # Now launch the process, and do not stop at the entry point. + process = target.LaunchSimple(None, None, os.getcwd()) + + # We should be stopped due to the breakpoint. Get frame #0. + process = target.GetProcess() + self.assertTrue(process.GetState() == lldb.eStateStopped, + PROCESS_STOPPED) + thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) + frame0 = thread.GetFrameAtIndex(0) + + # Watch 'global' for write. + value = frame0.FindValue('global', lldb.eValueTypeVariableGlobal) + watchpoint = value.Watch(True, False, True) + self.assertTrue(value and watchpoint, + "Successfully found the variable and set a watchpoint") + self.DebugSBValue(value) + + # Now set the condition as "global==5". + watchpoint.SetCondition('global==5') + self.expect(watchpoint.GetCondition(), exe=False, + startstr = 'global==5') + + # Hide stdout if not running with '-t' option. + if not self.TraceOn(): + self.HideStdout() + + print watchpoint + + # Continue. Expect the program to stop due to the variable being written to. + process.Continue() + + if (self.TraceOn()): + lldbutil.print_stacktraces(process) + + thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonWatchpoint) + self.assertTrue(thread, "The thread stopped due to watchpoint") + self.DebugSBValue(value) + + # Verify that the condition is met. + self.assertTrue(value.GetValueAsUnsigned() == 5) + + +if __name__ == '__main__': + import atexit + lldb.SBDebugger.Initialize() + atexit.register(lambda: lldb.SBDebugger.Terminate()) + unittest2.main() diff --git a/lldb/test/python_api/watchpoint/condition/main.cpp b/lldb/test/python_api/watchpoint/condition/main.cpp new file mode 100644 index 000000000000..f4c3527f8af2 --- /dev/null +++ b/lldb/test/python_api/watchpoint/condition/main.cpp @@ -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 +#include + +int32_t global = 0; // Watchpoint variable declaration. + +static void modify(int32_t &var) { + ++var; +} + +int main(int argc, char** argv) { + int local = 0; + printf("&global=%p\n", &global); + printf("about to write to 'global'...\n"); // Set break point at this line. + // When stopped, watch 'global', + // for the condition "global == 5". + for (int i = 0; i < 10; ++i) + modify(global); + + printf("global=%d\n", global); +}