aboutsummaryrefslogtreecommitdiff
path: root/lldb/test/API/functionalities/stop-on-sharedlibrary-load/TestStopOnSharedlibraryEvents.py
blob: 74ad3b2070e108440d11f22b0d86a1a314d5e834 (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
130
""" Test that stop-on-sharedlibrary-events works and cooperates with breakpoints. """
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


class TestStopOnSharedlibraryEvents(TestBase):
    @skipIfRemote
    @skipIfWindows
    @no_debug_info_test
    def test_stopping_breakpoints(self):
        self.do_test()

    @skipIfRemote
    @skipIfWindows
    @no_debug_info_test
    def test_auto_continue(self):
        def auto_continue(bkpt):
            bkpt.auto_continue = True

        self.do_test(auto_continue)

    @skipIfRemote
    @skipIfWindows
    @no_debug_info_test
    def test_failing_condition(self):
        def condition(bkpt):
            bkpt.condition = "1 == 2"

        self.do_test(condition)

    @skipIfRemote
    @skipIfWindows
    @no_debug_info_test
    def test_continue_callback(self):
        def bkpt_callback(bkpt):
            bkpt.SetScriptCallbackBody("return False")

        self.do_test(bkpt_callback)

    def do_test(self, bkpt_modifier=None):
        self.build()
        main_spec = lldb.SBFileSpec("main.cpp")
        # Launch and stop before the dlopen call.
        target, process, thread, _ = lldbutil.run_to_source_breakpoint(
            self,
            "// Set a breakpoint here",
            main_spec,
            extra_images=["load_a", "load_b"],
        )

        # Now turn on shared library events, continue and make sure we stop for the event.
        self.runCmd("settings set target.process.stop-on-sharedlibrary-events 1")
        self.addTearDownHook(
            lambda: self.runCmd(
                "settings set target.process.stop-on-sharedlibrary-events 0"
            )
        )

        # Since I don't know how to check that we are at the "right place" to stop for
        # shared library events, make an breakpoint after the load is done and
        # make sure we don't stop there:
        backstop_bkpt_1 = target.BreakpointCreateBySourceRegex(
            "Set another here - we should not hit this one", main_spec
        )
        self.assertGreater(
            backstop_bkpt_1.GetNumLocations(), 0, "Set our second breakpoint"
        )

        process.Continue()
        self.assertState(
            process.GetState(), lldb.eStateStopped, "We didn't stop for the load"
        )
        self.assertEqual(
            backstop_bkpt_1.GetHitCount(), 0, "Hit our backstop breakpoint"
        )

        # We should be stopped after the library is loaded, check that:
        found_it = False
        for module in target.modules:
            if module.file.basename.find("load_a") > -1:
                found_it = True
                break
        self.assertTrue(found_it, "Found the loaded module.")

        # Now capture the place where we stopped so we can set a breakpoint and make
        # sure the breakpoint there works correctly:
        load_address = process.GetSelectedThread().frames[0].addr
        load_bkpt = target.BreakpointCreateBySBAddress(load_address)
        self.assertGreater(load_bkpt.GetNumLocations(), 0, "Set the load breakpoint")

        backstop_bkpt_1.SetEnabled(False)

        backstop_bkpt_2 = target.BreakpointCreateBySourceRegex(
            "Set a third here - we should not hit this one", main_spec
        )
        self.assertGreater(
            backstop_bkpt_2.GetNumLocations(), 0, "Set our third breakpoint"
        )

        if bkpt_modifier is None:
            process.Continue()
            self.assertState(
                process.GetState(), lldb.eStateStopped, "We didn't stop for the load"
            )
            self.assertEqual(
                backstop_bkpt_2.GetHitCount(), 0, "Hit our backstop breakpoint"
            )
            self.assertStopReason(
                thread.stop_reason,
                lldb.eStopReasonBreakpoint,
                "We attributed the stop to the breakpoint",
            )
            self.assertEqual(
                load_bkpt.GetHitCount(), 1, "We hit our breakpoint at the load address"
            )
        else:
            bkpt_modifier(load_bkpt)
            process.Continue()
            self.assertState(process.GetState(), lldb.eStateStopped, "We didn't stop")
            self.assertTrue(thread.IsValid(), "Our thread was no longer valid.")
            self.assertStopReason(
                thread.stop_reason,
                lldb.eStopReasonBreakpoint,
                "We didn't hit some breakpoint",
            )
            self.assertEqual(
                backstop_bkpt_2.GetHitCount(), 1, "We continued to the right breakpoint"
            )