1//===-- SWIG Interface for SBBreakpoint -------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10namespace lldb {
11
12%feature("docstring",
13"Represents a logical breakpoint and its associated settings.
14
15For example (from test/functionalities/breakpoint/breakpoint_ignore_count/
16TestBreakpointIgnoreCount.py),
17
18    def breakpoint_ignore_count_python(self):
19        '''Use Python APIs to set breakpoint ignore count.'''
20        exe = os.path.join(os.getcwd(), 'a.out')
21
22        # Create a target by the debugger.
23        target = self.dbg.CreateTarget(exe)
24        self.assertTrue(target, VALID_TARGET)
25
26        # Now create a breakpoint on main.c by name 'c'.
27        breakpoint = target.BreakpointCreateByName('c', 'a.out')
28        self.assertTrue(breakpoint and
29                        breakpoint.GetNumLocations() == 1,
30                        VALID_BREAKPOINT)
31
32        # Get the breakpoint location from breakpoint after we verified that,
33        # indeed, it has one location.
34        location = breakpoint.GetLocationAtIndex(0)
35        self.assertTrue(location and
36                        location.IsEnabled(),
37                        VALID_BREAKPOINT_LOCATION)
38
39        # Set the ignore count on the breakpoint location.
40        location.SetIgnoreCount(2)
41        self.assertTrue(location.GetIgnoreCount() == 2,
42                        'SetIgnoreCount() works correctly')
43
44        # Now launch the process, and do not stop at entry point.
45        process = target.LaunchSimple(None, None, os.getcwd())
46        self.assertTrue(process, PROCESS_IS_VALID)
47
48        # Frame#0 should be on main.c:37, frame#1 should be on main.c:25, and
49        # frame#2 should be on main.c:48.
50        #lldbutil.print_stacktraces(process)
51        from lldbutil import get_stopped_thread
52        thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint)
53        self.assertTrue(thread != None, 'There should be a thread stopped due to breakpoint')
54        frame0 = thread.GetFrameAtIndex(0)
55        frame1 = thread.GetFrameAtIndex(1)
56        frame2 = thread.GetFrameAtIndex(2)
57        self.assertTrue(frame0.GetLineEntry().GetLine() == self.line1 and
58                        frame1.GetLineEntry().GetLine() == self.line3 and
59                        frame2.GetLineEntry().GetLine() == self.line4,
60                        STOPPED_DUE_TO_BREAKPOINT_IGNORE_COUNT)
61
62        # The hit count for the breakpoint should be 3.
63        self.assertTrue(breakpoint.GetHitCount() == 3)
64
65        process.Continue()
66
67SBBreakpoint supports breakpoint location iteration, for example,
68
69    for bl in breakpoint:
70        print 'breakpoint location load addr: %s' % hex(bl.GetLoadAddress())
71        print 'breakpoint location condition: %s' % hex(bl.GetCondition())
72
73and rich comparion methods which allow the API program to use,
74
75    if aBreakpoint == bBreakpoint:
76        ...
77
78to compare two breakpoints for equality."
79) SBBreakpoint;
80class SBBreakpoint
81{
82public:
83
84    typedef bool (*BreakpointHitCallback) (void *baton,
85                                           SBProcess &process,
86                                           SBThread &thread,
87                                           lldb::SBBreakpointLocation &location);
88
89    SBBreakpoint ();
90
91    SBBreakpoint (const lldb::SBBreakpoint& rhs);
92
93    ~SBBreakpoint();
94
95    break_id_t
96    GetID () const;
97
98    bool
99    IsValid() const;
100
101    void
102    ClearAllBreakpointSites ();
103
104    lldb::SBBreakpointLocation
105    FindLocationByAddress (lldb::addr_t vm_addr);
106
107    lldb::break_id_t
108    FindLocationIDByAddress (lldb::addr_t vm_addr);
109
110    lldb::SBBreakpointLocation
111    FindLocationByID (lldb::break_id_t bp_loc_id);
112
113    lldb::SBBreakpointLocation
114    GetLocationAtIndex (uint32_t index);
115
116    void
117    SetEnabled (bool enable);
118
119    bool
120    IsEnabled ();
121
122    void
123    SetOneShot (bool one_shot);
124
125    bool
126    IsOneShot ();
127
128    bool
129    IsInternal ();
130
131    uint32_t
132    GetHitCount () const;
133
134    void
135    SetIgnoreCount (uint32_t count);
136
137    uint32_t
138    GetIgnoreCount () const;
139
140    %feature("docstring", "
141    //--------------------------------------------------------------------------
142    /// The breakpoint stops only if the condition expression evaluates to true.
143    //--------------------------------------------------------------------------
144    ") SetCondition;
145    void
146    SetCondition (const char *condition);
147
148    %feature("docstring", "
149    //------------------------------------------------------------------
150    /// Get the condition expression for the breakpoint.
151    //------------------------------------------------------------------
152    ") GetCondition;
153    const char *
154    GetCondition ();
155
156    void
157    SetThreadID (lldb::tid_t sb_thread_id);
158
159    lldb::tid_t
160    GetThreadID ();
161
162    void
163    SetThreadIndex (uint32_t index);
164
165    uint32_t
166    GetThreadIndex() const;
167
168    void
169    SetThreadName (const char *thread_name);
170
171    const char *
172    GetThreadName () const;
173
174    void
175    SetQueueName (const char *queue_name);
176
177    const char *
178    GetQueueName () const;
179
180    void
181    SetCallback (BreakpointHitCallback callback, void *baton);
182
183    size_t
184    GetNumResolvedLocations() const;
185
186    size_t
187    GetNumLocations() const;
188
189    bool
190    GetDescription (lldb::SBStream &description);
191
192    bool
193    operator == (const lldb::SBBreakpoint& rhs);
194
195    bool
196    operator != (const lldb::SBBreakpoint& rhs);
197
198    static bool
199    EventIsBreakpointEvent (const lldb::SBEvent &event);
200
201    static lldb::BreakpointEventType
202    GetBreakpointEventTypeFromEvent (const lldb::SBEvent& event);
203
204    static lldb::SBBreakpoint
205    GetBreakpointFromEvent (const lldb::SBEvent& event);
206
207    static lldb::SBBreakpointLocation
208    GetBreakpointLocationAtIndexFromEvent (const lldb::SBEvent& event, uint32_t loc_idx);
209
210    static uint32_t
211    GetNumBreakpointLocationsFromEvent (const lldb::SBEvent &event_sp);
212
213    %pythoncode %{
214
215        __swig_getmethods__["id"] = GetID
216        if _newclass: id = property(GetID, None, doc='''A read only property that returns the ID of this breakpoint.''')
217
218        __swig_getmethods__["enabled"] = IsEnabled
219        __swig_setmethods__["enabled"] = SetEnabled
220        if _newclass: enabled = property(IsEnabled, SetEnabled, doc='''A read/write property that configures whether this breakpoint is enabled or not.''')
221
222        __swig_getmethods__["one_shot"] = IsOneShot
223        __swig_setmethods__["one_shot"] = SetOneShot
224        if _newclass: one_shot = property(IsOneShot, SetOneShot, doc='''A read/write property that configures whether this breakpoint is one-shot (deleted when hit) or not.''')
225
226        __swig_getmethods__["num_locations"] = GetNumLocations
227        if _newclass: num_locations = property(GetNumLocations, None, doc='''A read only property that returns the count of locations of this breakpoint.''')
228
229    %}
230
231
232};
233
234} // namespace lldb
235