blob: f44864a8b70a61c11f7c08aada9a21a58235f30f [file] [log] [blame]
Johnny Chend4dd7992011-09-27 01:19:20 +00001"""
2Use lldb Python SBTarget API to iterate on the watchpoint(s) for the target.
3"""
4
5import os, time
6import re
7import unittest2
8import lldb, lldbutil
9from lldbtest import *
10
Johnny Chen01a67862011-10-14 00:42:25 +000011class WatchpointIteratorTestCase(TestBase):
Johnny Chend4dd7992011-09-27 01:19:20 +000012
13 mydir = os.path.join("python_api", "watchpoint")
14
15 def setUp(self):
16 # Call super's setUp().
17 TestBase.setUp(self)
18 # Our simple source filename.
19 self.source = 'main.c'
20 # Find the line number to break inside main().
21 self.line = line_number(self.source, '// Set break point at this line.')
22
23 @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
24 @python_api_test
Johnny Chen24086bc2012-04-06 19:54:10 +000025 @dsym_test
Johnny Chen01a67862011-10-14 00:42:25 +000026 def test_watch_iter_with_dsym(self):
27 """Exercise SBTarget.watchpoint_iter() API to iterate on the available watchpoints."""
Johnny Chend4dd7992011-09-27 01:19:20 +000028 self.buildDsym()
Johnny Chen01a67862011-10-14 00:42:25 +000029 self.do_watchpoint_iter()
Johnny Chend4dd7992011-09-27 01:19:20 +000030
Daniel Malea93aec0f2012-11-23 21:59:29 +000031 @expectedFailureLinux # bugzilla 14416
Johnny Chend4dd7992011-09-27 01:19:20 +000032 @python_api_test
Johnny Chen24086bc2012-04-06 19:54:10 +000033 @dwarf_test
Johnny Chen01a67862011-10-14 00:42:25 +000034 def test_watch_iter_with_dwarf(self):
35 """Exercise SBTarget.watchpoint_iter() API to iterate on the available watchpoints."""
Johnny Chend4dd7992011-09-27 01:19:20 +000036 self.buildDwarf()
Johnny Chen01a67862011-10-14 00:42:25 +000037 self.do_watchpoint_iter()
Johnny Chend4dd7992011-09-27 01:19:20 +000038
Johnny Chen01a67862011-10-14 00:42:25 +000039 def do_watchpoint_iter(self):
40 """Use SBTarget.watchpoint_iter() to do Pythonic iteration on the available watchpoints."""
Johnny Chend4dd7992011-09-27 01:19:20 +000041 exe = os.path.join(os.getcwd(), "a.out")
42
43 # Create a target by the debugger.
44 target = self.dbg.CreateTarget(exe)
45 self.assertTrue(target, VALID_TARGET)
46
47 # Create a breakpoint on main.c in order to set our watchpoint later.
48 breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
49 self.assertTrue(breakpoint and
50 breakpoint.GetNumLocations() == 1,
51 VALID_BREAKPOINT)
52
53 # Now launch the process, and do not stop at the entry point.
54 process = target.LaunchSimple(None, None, os.getcwd())
55
56 # We should be stopped due to the breakpoint. Get frame #0.
57 process = target.GetProcess()
58 self.assertTrue(process.GetState() == lldb.eStateStopped,
59 PROCESS_STOPPED)
60 thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
61 frame0 = thread.GetFrameAtIndex(0)
62
Johnny Chen01a67862011-10-14 00:42:25 +000063 # Watch 'global' for read and write.
64 value = frame0.FindValue('global', lldb.eValueTypeVariableGlobal)
Johnny Chenb90827e2012-06-04 23:19:54 +000065 error = lldb.SBError();
66 watchpoint = value.Watch(True, True, True, error)
Johnny Chen01a67862011-10-14 00:42:25 +000067 self.assertTrue(value and watchpoint,
68 "Successfully found the variable and set a watchpoint")
Johnny Chend4dd7992011-09-27 01:19:20 +000069 self.DebugSBValue(value)
70
Johnny Chen01a67862011-10-14 00:42:25 +000071 # Hide stdout if not running with '-t' option.
72 if not self.TraceOn():
73 self.HideStdout()
74
Johnny Chend4dd7992011-09-27 01:19:20 +000075 # There should be only 1 watchpoint location under the target.
Johnny Chen01a67862011-10-14 00:42:25 +000076 self.assertTrue(target.GetNumWatchpoints() == 1)
77 self.assertTrue(watchpoint.IsEnabled())
78 watch_id = watchpoint.GetID()
Johnny Chend4dd7992011-09-27 01:19:20 +000079 self.assertTrue(watch_id != 0)
80
81 # Continue. Expect the program to stop due to the variable being written to.
82 process.Continue()
83
84 # Hide stdout if not running with '-t' option.
85 if not self.TraceOn():
86 self.HideStdout()
87
88 # Print the stack traces.
89 lldbutil.print_stacktraces(process)
90
91 thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonWatchpoint)
92 self.assertTrue(thread, "The thread stopped due to watchpoint")
93 self.DebugSBValue(value)
94
95 # We currently only support hardware watchpoint. Verify that we have a
96 # meaningful hardware index at this point. Exercise the printed repr of
97 # SBWatchpointLocation.
Johnny Chen01a67862011-10-14 00:42:25 +000098 print watchpoint
99 self.assertTrue(watchpoint.GetHardwareIndex() != -1)
Johnny Chend4dd7992011-09-27 01:19:20 +0000100
Johnny Chen01a67862011-10-14 00:42:25 +0000101 # SBWatchpoint.GetDescription() takes a description level arg.
102 print lldbutil.get_description(watchpoint, lldb.eDescriptionLevelFull)
Johnny Chen469683e2011-09-27 21:27:19 +0000103
Johnny Chend4dd7992011-09-27 01:19:20 +0000104 # Now disable the 'rw' watchpoint. The program won't stop when it reads
105 # 'global' next.
Johnny Chen01a67862011-10-14 00:42:25 +0000106 watchpoint.SetEnabled(False)
107 self.assertTrue(watchpoint.GetHardwareIndex() == -1)
108 self.assertFalse(watchpoint.IsEnabled())
Johnny Chend4dd7992011-09-27 01:19:20 +0000109
110 # Continue. The program does not stop again when the variable is being
111 # read from because the watchpoint location has been disabled.
112 process.Continue()
113
114 # At this point, the inferior process should have exited.
115 self.assertTrue(process.GetState() == lldb.eStateExited, PROCESS_EXITED)
116
117 # Verify some vital statistics and exercise the iterator API.
Johnny Chen01a67862011-10-14 00:42:25 +0000118 for watchpoint in target.watchpoint_iter():
119 self.assertTrue(watchpoint)
120 self.assertTrue(watchpoint.GetWatchSize() == 4)
121 self.assertTrue(watchpoint.GetHitCount() == 1)
122 print watchpoint
Johnny Chend4dd7992011-09-27 01:19:20 +0000123
124
125if __name__ == '__main__':
126 import atexit
127 lldb.SBDebugger.Initialize()
128 atexit.register(lambda: lldb.SBDebugger.Terminate())
129 unittest2.main()