• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- Breakpoint.h --------------------------------------------*- 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 
10 #ifndef liblldb_Breakpoint_h_
11 #define liblldb_Breakpoint_h_
12 
13 // C Includes
14 // C++ Includes
15 // Other libraries and framework includes
16 // Project includes
17 #include "lldb/Breakpoint/BreakpointLocationList.h"
18 #include "lldb/Breakpoint/BreakpointOptions.h"
19 #include "lldb/Breakpoint/BreakpointLocationCollection.h"
20 #include "lldb/Breakpoint/Stoppoint.h"
21 #include "lldb/Core/SearchFilter.h"
22 #include "lldb/Core/Event.h"
23 #include "lldb/Core/StringList.h"
24 
25 namespace lldb_private {
26 
27 //----------------------------------------------------------------------
28 /// @class Breakpoint Breakpoint.h "lldb/Breakpoint/Breakpoint.h"
29 /// @brief Class that manages logical breakpoint setting.
30 //----------------------------------------------------------------------
31 
32 //----------------------------------------------------------------------
33 /// General Outline:
34 /// A breakpoint has four main parts, a filter, a resolver, the list of breakpoint
35 /// locations that have been determined for the filter/resolver pair, and finally
36 /// a set of options for the breakpoint.
37 ///
38 /// \b Filter:
39 /// This is an object derived from SearchFilter.  It manages the search
40 /// for breakpoint location matches through the symbols in the module list of the target
41 /// that owns it.  It also filters out locations based on whatever logic it wants.
42 ///
43 /// \b Resolver:
44 /// This is an object derived from BreakpointResolver.  It provides a
45 /// callback to the filter that will find breakpoint locations.  How it does this is
46 /// determined by what kind of resolver it is.
47 ///
48 /// The Breakpoint class also provides constructors for the common breakpoint cases
49 /// which make the appropriate filter and resolver for you.
50 ///
51 /// \b Location List:
52 /// This stores the breakpoint locations that have been determined
53 /// to date.  For a given breakpoint, there will be only one location with a given
54 /// address.  Adding a location at an already taken address will just return the location
55 /// already at that address.  Locations can be looked up by ID, or by address.
56 ///
57 /// \b Options:
58 /// This includes:
59 ///    \b Enabled/Disabled
60 ///    \b Ignore Count
61 ///    \b Callback
62 ///    \b Condition
63 /// Note, these options can be set on the breakpoint, and they can also be set on the
64 /// individual locations.  The options set on the breakpoint take precedence over the
65 /// options set on the individual location.
66 /// So for instance disabling the breakpoint will cause NONE of the locations to get hit.
67 /// But if the breakpoint is enabled, then the location's enabled state will be checked
68 /// to determine whether to insert that breakpoint location.
69 /// Similarly, if the breakpoint condition says "stop", we won't check the location's condition.
70 /// But if the breakpoint condition says "continue", then we will check the location for whether
71 /// to actually stop or not.
72 /// One subtle point worth observing here is that you don't actually stop at a Breakpoint, you
73 /// always stop at one of its locations.  So the "should stop" tests are done by the location,
74 /// not by the breakpoint.
75 //----------------------------------------------------------------------
76 class Breakpoint:
77     public std::enable_shared_from_this<Breakpoint>,
78     public Stoppoint
79 {
80 public:
81 
82     static const ConstString &
83     GetEventIdentifier ();
84 
85 
86     //------------------------------------------------------------------
87     /// An enum specifying the match style for breakpoint settings.  At
88     /// present only used for function name style breakpoints.
89     //------------------------------------------------------------------
90     typedef enum
91     {
92         Exact,
93         Regexp,
94         Glob
95     } MatchType;
96 
97     class BreakpointEventData :
98         public EventData
99     {
100     public:
101 
102         static const ConstString &
103         GetFlavorString ();
104 
105         virtual const ConstString &
106         GetFlavor () const;
107 
108         BreakpointEventData (lldb::BreakpointEventType sub_type,
109                              const lldb::BreakpointSP &new_breakpoint_sp);
110 
111         virtual
112         ~BreakpointEventData();
113 
114         lldb::BreakpointEventType
115         GetBreakpointEventType () const;
116 
117         lldb::BreakpointSP &
118         GetBreakpoint ();
119 
120         BreakpointLocationCollection &
GetBreakpointLocationCollection()121         GetBreakpointLocationCollection()
122         {
123             return m_locations;
124         }
125 
126 
127         virtual void
128         Dump (Stream *s) const;
129 
130         static lldb::BreakpointEventType
131         GetBreakpointEventTypeFromEvent (const lldb::EventSP &event_sp);
132 
133         static lldb::BreakpointSP
134         GetBreakpointFromEvent (const lldb::EventSP &event_sp);
135 
136         static lldb::BreakpointLocationSP
137         GetBreakpointLocationAtIndexFromEvent (const lldb::EventSP &event_sp, uint32_t loc_idx);
138 
139         static size_t
140         GetNumBreakpointLocationsFromEvent (const lldb::EventSP &event_sp);
141 
142         static const BreakpointEventData *
143         GetEventDataFromEvent (const Event *event_sp);
144 
145     private:
146 
147         lldb::BreakpointEventType m_breakpoint_event;
148         lldb::BreakpointSP m_new_breakpoint_sp;
149         BreakpointLocationCollection m_locations;
150 
151         DISALLOW_COPY_AND_ASSIGN (BreakpointEventData);
152     };
153 
154 
155     //------------------------------------------------------------------
156     /// Destructor.
157     ///
158     /// The destructor is not virtual since there should be no reason to subclass
159     /// breakpoints.  The varieties of breakpoints are specified instead by
160     /// providing different resolvers & filters.
161     //------------------------------------------------------------------
162     ~Breakpoint();
163 
164     //------------------------------------------------------------------
165     // Methods
166     //------------------------------------------------------------------
167 
168     //------------------------------------------------------------------
169     /// Tell whether this breakpoint is an "internal" breakpoint.
170     /// @return
171     ///     Returns \b true if this is an internal breakpoint, \b false otherwise.
172     //------------------------------------------------------------------
173     bool
174     IsInternal () const;
175 
176     //------------------------------------------------------------------
177     /// Standard "Dump" method.  At present it does nothing.
178     //------------------------------------------------------------------
179     void
180     Dump (Stream *s);
181 
182     //------------------------------------------------------------------
183     // The next set of methods provide ways to tell the breakpoint to update
184     // it's location list - usually done when modules appear or disappear.
185     //------------------------------------------------------------------
186 
187 
188     //------------------------------------------------------------------
189     /// Tell this breakpoint to clear all its breakpoint sites.  Done
190     /// when the process holding the breakpoint sites is destroyed.
191     //------------------------------------------------------------------
192     void
193     ClearAllBreakpointSites ();
194 
195     //------------------------------------------------------------------
196     /// Tell this breakpoint to scan it's target's module list and resolve any
197     /// new locations that match the breakpoint's specifications.
198     //------------------------------------------------------------------
199     void
200     ResolveBreakpoint ();
201 
202     //------------------------------------------------------------------
203     /// Tell this breakpoint to scan a given module list and resolve any
204     /// new locations that match the breakpoint's specifications.
205     ///
206     /// @param[in] changed_modules
207     ///    The list of modules to look in for new locations.
208     //------------------------------------------------------------------
209     void
210     ResolveBreakpointInModules (ModuleList &changed_modules);
211 
212 
213     //------------------------------------------------------------------
214     /// Like ResolveBreakpointInModules, but allows for "unload" events, in
215     /// which case we will remove any locations that are in modules that got
216     /// unloaded.
217     ///
218     /// @param[in] changedModules
219     ///    The list of modules to look in for new locations.
220     /// @param[in] load_event
221     ///    If \b true then the modules were loaded, if \b false, unloaded.
222     /// @param[in] delete_locations
223     ///    If \b true then the modules were unloaded delete any locations in the changed modules.
224     //------------------------------------------------------------------
225     void
226     ModulesChanged (ModuleList &changed_modules,
227                     bool load_event,
228                     bool delete_locations = false);
229 
230 
231     //------------------------------------------------------------------
232     /// Tells the breakpoint the old module \a old_module_sp has been
233     /// replaced by new_module_sp (usually because the underlying file has been
234     /// rebuilt, and the old version is gone.)
235     ///
236     /// @param[in] old_module_sp
237     ///    The old module that is going away.
238     /// @param[in] new_module_sp
239     ///    The new module that is replacing it.
240     //------------------------------------------------------------------
241     void
242     ModuleReplaced (lldb::ModuleSP old_module_sp, lldb::ModuleSP new_module_sp);
243 
244     //------------------------------------------------------------------
245     // The next set of methods provide access to the breakpoint locations
246     // for this breakpoint.
247     //------------------------------------------------------------------
248 
249     //------------------------------------------------------------------
250     /// Add a location to the breakpoint's location list.  This is only meant
251     /// to be called by the breakpoint's resolver.  FIXME: how do I ensure that?
252     ///
253     /// @param[in] addr
254     ///    The Address specifying the new location.
255     /// @param[out] new_location
256     ///    Set to \b true if a new location was created, to \b false if there
257     ///    already was a location at this Address.
258     /// @return
259     ///    Returns a pointer to the new location.
260     //------------------------------------------------------------------
261     lldb::BreakpointLocationSP
262     AddLocation (const Address &addr,
263                  bool *new_location = NULL);
264 
265     //------------------------------------------------------------------
266     /// Find a breakpoint location by Address.
267     ///
268     /// @param[in] addr
269     ///    The Address specifying the location.
270     /// @return
271     ///    Returns a shared pointer to the location at \a addr.  The pointer
272     ///    in the shared pointer will be NULL if there is no location at that address.
273     //------------------------------------------------------------------
274     lldb::BreakpointLocationSP
275     FindLocationByAddress (const Address &addr);
276 
277     //------------------------------------------------------------------
278     /// Find a breakpoint location ID by Address.
279     ///
280     /// @param[in] addr
281     ///    The Address specifying the location.
282     /// @return
283     ///    Returns the UID of the location at \a addr, or \b LLDB_INVALID_ID if
284     ///    there is no breakpoint location at that address.
285     //------------------------------------------------------------------
286     lldb::break_id_t
287     FindLocationIDByAddress (const Address &addr);
288 
289     //------------------------------------------------------------------
290     /// Find a breakpoint location for a given breakpoint location ID.
291     ///
292     /// @param[in] bp_loc_id
293     ///    The ID specifying the location.
294     /// @return
295     ///    Returns a shared pointer to the location with ID \a bp_loc_id.  The pointer
296     ///    in the shared pointer will be NULL if there is no location with that ID.
297     //------------------------------------------------------------------
298     lldb::BreakpointLocationSP
299     FindLocationByID (lldb::break_id_t bp_loc_id);
300 
301     //------------------------------------------------------------------
302     /// Get breakpoint locations by index.
303     ///
304     /// @param[in] index
305     ///    The location index.
306     ///
307     /// @return
308     ///     Returns a shared pointer to the location with index \a
309     ///     index. The shared pointer might contain NULL if \a index is
310     ///     greater than then number of actual locations.
311     //------------------------------------------------------------------
312     lldb::BreakpointLocationSP
313     GetLocationAtIndex (size_t index);
314 
315     //------------------------------------------------------------------
316     // The next section deals with various breakpoint options.
317     //------------------------------------------------------------------
318 
319     //------------------------------------------------------------------
320     /// If \a enable is \b true, enable the breakpoint, if \b false disable it.
321     //------------------------------------------------------------------
322     void
323     SetEnabled (bool enable);
324 
325     //------------------------------------------------------------------
326     /// Check the Enable/Disable state.
327     /// @return
328     ///     \b true if the breakpoint is enabled, \b false if disabled.
329     //------------------------------------------------------------------
330     bool
331     IsEnabled ();
332 
333     //------------------------------------------------------------------
334     /// Set the breakpoint to ignore the next \a count breakpoint hits.
335     /// @param[in] count
336     ///    The number of breakpoint hits to ignore.
337     //------------------------------------------------------------------
338     void
339     SetIgnoreCount (uint32_t count);
340 
341     //------------------------------------------------------------------
342     /// Return the current ignore count/
343     /// @return
344     ///     The number of breakpoint hits to be ignored.
345     //------------------------------------------------------------------
346     uint32_t
347     GetIgnoreCount () const;
348 
349     //------------------------------------------------------------------
350     /// Return the current hit count for all locations.
351     /// @return
352     ///     The current hit count for all locations.
353     //------------------------------------------------------------------
354     uint32_t
355     GetHitCount () const;
356 
357 
358     //------------------------------------------------------------------
359     /// If \a one_shot is \b true, breakpoint will be deleted on first hit.
360     //------------------------------------------------------------------
361     void
362     SetOneShot (bool one_shot);
363 
364     //------------------------------------------------------------------
365     /// Check the OneShot state.
366     /// @return
367     ///     \b true if the breakpoint is one shot, \b false otherwise.
368     //------------------------------------------------------------------
369     bool
370     IsOneShot () const;
371 
372     //------------------------------------------------------------------
373     /// Set the valid thread to be checked when the breakpoint is hit.
374     /// @param[in] thread_id
375     ///    If this thread hits the breakpoint, we stop, otherwise not.
376     //------------------------------------------------------------------
377     void
378     SetThreadID (lldb::tid_t thread_id);
379 
380     //------------------------------------------------------------------
381     /// Return the current stop thread value.
382     /// @return
383     ///     The thread id for which the breakpoint hit will stop, LLDB_INVALID_THREAD_ID for all threads.
384     //------------------------------------------------------------------
385     lldb::tid_t
386     GetThreadID () const;
387 
388     void
389     SetThreadIndex (uint32_t index);
390 
391     uint32_t
392     GetThreadIndex() const;
393 
394     void
395     SetThreadName (const char *thread_name);
396 
397     const char *
398     GetThreadName () const;
399 
400     void
401     SetQueueName (const char *queue_name);
402 
403     const char *
404     GetQueueName () const;
405 
406     //------------------------------------------------------------------
407     /// Set the callback action invoked when the breakpoint is hit.
408     ///
409     /// @param[in] callback
410     ///    The method that will get called when the breakpoint is hit.
411     /// @param[in] baton
412     ///    A void * pointer that will get passed back to the callback function.
413     /// @param[in] is_synchronous
414     ///    If \b true the callback will be run on the private event thread
415     ///    before the stop event gets reported.  If false, the callback will get
416     ///    handled on the public event thead after the stop has been posted.
417     ///
418     /// @return
419     ///    \b true if the process should stop when you hit the breakpoint.
420     ///    \b false if it should continue.
421     //------------------------------------------------------------------
422     void
423     SetCallback (BreakpointHitCallback callback,
424                  void *baton,
425                  bool is_synchronous = false);
426 
427     void
428     SetCallback (BreakpointHitCallback callback,
429                  const lldb::BatonSP &callback_baton_sp,
430                  bool is_synchronous = false);
431 
432     void
433     ClearCallback ();
434 
435     //------------------------------------------------------------------
436     /// Set the breakpoint's condition.
437     ///
438     /// @param[in] condition
439     ///    The condition expression to evaluate when the breakpoint is hit.
440     ///    Pass in NULL to clear the condition.
441     //------------------------------------------------------------------
442     void SetCondition (const char *condition);
443 
444     //------------------------------------------------------------------
445     /// Return a pointer to the text of the condition expression.
446     ///
447     /// @return
448     ///    A pointer to the condition expression text, or NULL if no
449     //     condition has been set.
450     //------------------------------------------------------------------
451     const char *GetConditionText () const;
452 
453     //------------------------------------------------------------------
454     // The next section are various utility functions.
455     //------------------------------------------------------------------
456 
457     //------------------------------------------------------------------
458     /// Return the number of breakpoint locations that have resolved to
459     /// actual breakpoint sites.
460     ///
461     /// @return
462     ///     The number locations resolved breakpoint sites.
463     //------------------------------------------------------------------
464     size_t
465     GetNumResolvedLocations() const;
466 
467     //------------------------------------------------------------------
468     /// Return the number of breakpoint locations.
469     ///
470     /// @return
471     ///     The number breakpoint locations.
472     //------------------------------------------------------------------
473     size_t
474     GetNumLocations() const;
475 
476     //------------------------------------------------------------------
477     /// Put a description of this breakpoint into the stream \a s.
478     ///
479     /// @param[in] s
480     ///     Stream into which to dump the description.
481     ///
482     /// @param[in] level
483     ///     The description level that indicates the detail level to
484     ///     provide.
485     ///
486     /// @see lldb::DescriptionLevel
487     //------------------------------------------------------------------
488     void
489     GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_locations = false);
490 
491     //------------------------------------------------------------------
492     /// Set the "kind" description for a breakpoint.  If the breakpoint is hit
493     /// the stop info will show this "kind" description instead of the breakpoint
494     /// number.  Mostly useful for internal breakpoints, where the breakpoint number
495     /// doesn't have meaning to the user.
496     ///
497     /// @param[in] kind
498     ///     New "kind" description.
499     //------------------------------------------------------------------
500     void
SetBreakpointKind(const char * kind)501     SetBreakpointKind (const char *kind)
502     {
503         m_kind_description.assign (kind);
504     }
505 
506     //------------------------------------------------------------------
507     /// Return the "kind" description for a breakpoint.
508     ///
509     /// @return
510     ///     The breakpoint kind, or NULL if none is set.
511     //------------------------------------------------------------------
GetBreakpointKind()512     const char *GetBreakpointKind () const
513     {
514         return m_kind_description.c_str();
515     }
516 
517     //------------------------------------------------------------------
518     /// Accessor for the breakpoint Target.
519     /// @return
520     ///     This breakpoint's Target.
521     //------------------------------------------------------------------
522     Target &
523     GetTarget ();
524 
525     const Target &
526     GetTarget () const;
527 
528     void
529     GetResolverDescription (Stream *s);
530 
531     //------------------------------------------------------------------
532     /// Find breakpoint locations which match the (filename, line_number) description.
533     /// The breakpoint location collection is to be filled with the matching locations.
534     /// It should be initialized with 0 size by the API client.
535     ///
536     /// @return
537     ///     True if there is a match
538     ///
539     ///     The locations which match the filename and line_number in loc_coll.  If its
540     ///     size is 0 and true is returned, it means the breakpoint fully matches the
541     ///     description.
542     //------------------------------------------------------------------
543     bool GetMatchingFileLine(const ConstString &filename, uint32_t line_number,
544                              BreakpointLocationCollection &loc_coll);
545 
546     void
547     GetFilterDescription (Stream *s);
548 
549     //------------------------------------------------------------------
550     /// Returns the BreakpointOptions structure set at the breakpoint level.
551     ///
552     /// Meant to be used by the BreakpointLocation class.
553     ///
554     /// @return
555     ///     A pointer to this breakpoint's BreakpointOptions.
556     //------------------------------------------------------------------
557     BreakpointOptions *
558     GetOptions ();
559 
560 
561     //------------------------------------------------------------------
562     /// Invoke the callback action when the breakpoint is hit.
563     ///
564     /// Meant to be used by the BreakpointLocation class.
565     ///
566     /// @param[in] context
567     ///     Described the breakpoint event.
568     ///
569     /// @param[in] bp_loc_id
570     ///     Which breakpoint location hit this breakpoint.
571     ///
572     /// @return
573     ///     \b true if the target should stop at this breakpoint and \b false not.
574     //------------------------------------------------------------------
575     bool
576     InvokeCallback (StoppointCallbackContext *context,
577                     lldb::break_id_t bp_loc_id);
578 
579 protected:
580     friend class Target;
581     //------------------------------------------------------------------
582     // Protected Methods
583     //------------------------------------------------------------------
584 
585 
586     //------------------------------------------------------------------
587     /// Constructors and Destructors
588     /// Only the Target can make a breakpoint, and it owns the breakpoint lifespans.
589     /// The constructor takes a filter and a resolver.  Up in Target there are convenience
590     /// variants that make breakpoints for some common cases.
591     //------------------------------------------------------------------
592     // This is the generic constructor
593     Breakpoint(Target &target, lldb::SearchFilterSP &filter_sp, lldb::BreakpointResolverSP &resolver_sp);
594 
595     friend class BreakpointLocation;  // To call the following two when determining whether to stop.
596 
597     void
598     DecrementIgnoreCount();
599 
600     // BreakpointLocation::IgnoreCountShouldStop & Breakpoint::IgnoreCountShouldStop can only be called once per stop,
601     // and BreakpointLocation::IgnoreCountShouldStop should be tested first, and if it returns false we should
602     // continue, otherwise we should test Breakpoint::IgnoreCountShouldStop.
603 
604     bool
605     IgnoreCountShouldStop ();
606 
607 private:
608     //------------------------------------------------------------------
609     // For Breakpoint only
610     //------------------------------------------------------------------
611     bool m_being_created;
612     Target &m_target;                         // The target that holds this breakpoint.
613     lldb::SearchFilterSP m_filter_sp;         // The filter that constrains the breakpoint's domain.
614     lldb::BreakpointResolverSP m_resolver_sp; // The resolver that defines this breakpoint.
615     BreakpointOptions m_options;              // Settable breakpoint options
616     BreakpointLocationList m_locations;       // The list of locations currently found for this breakpoint.
617     std::string            m_kind_description;
618 
619     void
620     SendBreakpointChangedEvent (lldb::BreakpointEventType eventKind);
621 
622     void
623     SendBreakpointChangedEvent (BreakpointEventData *data);
624 
625     DISALLOW_COPY_AND_ASSIGN(Breakpoint);
626 };
627 
628 } // namespace lldb_private
629 
630 #endif  // liblldb_Breakpoint_h_
631