aboutsummaryrefslogtreecommitdiff
path: root/lldb/test/API/python_api/watchpoint/TestWatchpointRead.py
blob: f482ebe5b1ecee6aa2d72d78ba2abdffeceed39f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
"""
Use lldb Python SBTarget API to set read watchpoints
"""

import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class SetReadOnlyWatchpointTestCase(TestBase):
    NO_DEBUG_INFO_TESTCASE = True

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Our simple source filename.
        self.source = "main.c"
        # Find the line number to break inside main().
        self.line = line_number(self.source, "// Set break point at this line.")
        self.build()

    # Intel hardware does not support read-only watchpoints
    @expectedFailureAll(archs=["i386", "x86_64"])
    def test_read_watchpoint_watch_address(self):
        exe = self.getBuildArtifact("a.out")

        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, self.get_process_working_directory())

        # We should be stopped due to the breakpoint.  Get frame #0.
        process = target.GetProcess()
        self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
        thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
        frame0 = thread.GetFrameAtIndex(0)

        value = frame0.FindValue("global", lldb.eValueTypeVariableGlobal)
        local = frame0.FindValue("local", lldb.eValueTypeVariableLocal)
        error = lldb.SBError()

        watchpoint = target.WatchAddress(value.GetLoadAddress(), 1, True, False, error)
        self.assertTrue(
            value and local and watchpoint,
            "Successfully found the values and set a watchpoint",
        )
        self.DebugSBValue(value)
        self.DebugSBValue(local)

        # 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
        # read, but *not* written to.
        process.Continue()

        if self.TraceOn():
            lldbutil.print_stacktraces(process)

        self.assertTrue(
            local.GetValueAsSigned() > 0, "The local variable has been incremented"
        )

    # Intel hardware does not support read-only watchpoints
    @expectedFailureAll(archs=["i386", "x86_64"])
    def test_read_watchpoint_watch_create_by_address(self):
        exe = self.getBuildArtifact("a.out")

        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, self.get_process_working_directory())

        # We should be stopped due to the breakpoint.  Get frame #0.
        process = target.GetProcess()
        self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
        thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
        frame0 = thread.GetFrameAtIndex(0)

        value = frame0.FindValue("global", lldb.eValueTypeVariableGlobal)
        local = frame0.FindValue("local", lldb.eValueTypeVariableLocal)
        error = lldb.SBError()

        wp_opts = lldb.SBWatchpointOptions()
        wp_opts.SetWatchpointTypeRead(True)
        watchpoint = target.WatchpointCreateByAddress(
            value.GetLoadAddress(), 1, wp_opts, error
        )
        self.assertTrue(
            value and local and watchpoint,
            "Successfully found the values and set a watchpoint",
        )
        self.DebugSBValue(value)
        self.DebugSBValue(local)

        # 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
        # read, but *not* written to.
        process.Continue()

        if self.TraceOn():
            lldbutil.print_stacktraces(process)

        self.assertTrue(
            local.GetValueAsSigned() > 0, "The local variable has been incremented"
        )