1 /* Python interface to breakpoints
3 Copyright (C) 2008-2021 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 #include "python-internal.h"
25 #include "breakpoint.h"
27 #include "gdbthread.h"
28 #include "observable.h"
29 #include "cli/cli-script.h"
31 #include "arch-utils.h"
37 /* Number of live breakpoints. */
40 /* Variables used to pass information between the Breakpoint
41 constructor and the breakpoint-created hook function. */
42 gdbpy_breakpoint_object
*bppy_pending_object
;
44 /* Function that is called when a Python condition is evaluated. */
45 static const char stop_func
[] = "stop";
47 /* This is used to initialize various gdb.bp_* constants. */
56 /* Entries related to the type of user set breakpoints. */
57 static struct pybp_code pybp_codes
[] =
59 { "BP_NONE", bp_none
},
60 { "BP_BREAKPOINT", bp_breakpoint
},
61 { "BP_HARDWARE_BREAKPOINT", bp_hardware_breakpoint
},
62 { "BP_WATCHPOINT", bp_watchpoint
},
63 { "BP_HARDWARE_WATCHPOINT", bp_hardware_watchpoint
},
64 { "BP_READ_WATCHPOINT", bp_read_watchpoint
},
65 { "BP_ACCESS_WATCHPOINT", bp_access_watchpoint
},
66 {NULL
} /* Sentinel. */
69 /* Entries related to the type of watchpoint. */
70 static struct pybp_code pybp_watch_types
[] =
72 { "WP_READ", hw_read
},
73 { "WP_WRITE", hw_write
},
74 { "WP_ACCESS", hw_access
},
75 {NULL
} /* Sentinel. */
78 /* Python function which checks the validity of a breakpoint object. */
80 bppy_is_valid (PyObject
*self
, PyObject
*args
)
82 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
89 /* Python function to test whether or not the breakpoint is enabled. */
91 bppy_get_enabled (PyObject
*self
, void *closure
)
93 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
95 BPPY_REQUIRE_VALID (self_bp
);
98 if (self_bp
->bp
->enable_state
== bp_enabled
)
103 /* Python function to test whether or not the breakpoint is silent. */
105 bppy_get_silent (PyObject
*self
, void *closure
)
107 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
109 BPPY_REQUIRE_VALID (self_bp
);
110 if (self_bp
->bp
->silent
)
115 /* Python function to set the enabled state of a breakpoint. */
117 bppy_set_enabled (PyObject
*self
, PyObject
*newvalue
, void *closure
)
119 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
122 BPPY_SET_REQUIRE_VALID (self_bp
);
124 if (newvalue
== NULL
)
126 PyErr_SetString (PyExc_TypeError
,
127 _("Cannot delete `enabled' attribute."));
131 else if (! PyBool_Check (newvalue
))
133 PyErr_SetString (PyExc_TypeError
,
134 _("The value of `enabled' must be a boolean."));
138 cmp
= PyObject_IsTrue (newvalue
);
145 enable_breakpoint (self_bp
->bp
);
147 disable_breakpoint (self_bp
->bp
);
149 catch (const gdb_exception
&except
)
151 GDB_PY_SET_HANDLE_EXCEPTION (except
);
157 /* Python function to set the 'silent' state of a breakpoint. */
159 bppy_set_silent (PyObject
*self
, PyObject
*newvalue
, void *closure
)
161 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
164 BPPY_SET_REQUIRE_VALID (self_bp
);
166 if (newvalue
== NULL
)
168 PyErr_SetString (PyExc_TypeError
,
169 _("Cannot delete `silent' attribute."));
172 else if (! PyBool_Check (newvalue
))
174 PyErr_SetString (PyExc_TypeError
,
175 _("The value of `silent' must be a boolean."));
179 cmp
= PyObject_IsTrue (newvalue
);
183 breakpoint_set_silent (self_bp
->bp
, cmp
);
188 /* Python function to set the thread of a breakpoint. */
190 bppy_set_thread (PyObject
*self
, PyObject
*newvalue
, void *closure
)
192 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
195 BPPY_SET_REQUIRE_VALID (self_bp
);
197 if (newvalue
== NULL
)
199 PyErr_SetString (PyExc_TypeError
,
200 _("Cannot delete `thread' attribute."));
203 else if (PyInt_Check (newvalue
))
205 if (! gdb_py_int_as_long (newvalue
, &id
))
208 if (!valid_global_thread_id (id
))
210 PyErr_SetString (PyExc_RuntimeError
,
211 _("Invalid thread ID."));
215 else if (newvalue
== Py_None
)
219 PyErr_SetString (PyExc_TypeError
,
220 _("The value of `thread' must be an integer or None."));
224 breakpoint_set_thread (self_bp
->bp
, id
);
229 /* Python function to set the (Ada) task of a breakpoint. */
231 bppy_set_task (PyObject
*self
, PyObject
*newvalue
, void *closure
)
233 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
237 BPPY_SET_REQUIRE_VALID (self_bp
);
239 if (newvalue
== NULL
)
241 PyErr_SetString (PyExc_TypeError
,
242 _("Cannot delete `task' attribute."));
245 else if (PyInt_Check (newvalue
))
247 if (! gdb_py_int_as_long (newvalue
, &id
))
252 valid_id
= valid_task_id (id
);
254 catch (const gdb_exception
&except
)
256 GDB_PY_SET_HANDLE_EXCEPTION (except
);
261 PyErr_SetString (PyExc_RuntimeError
,
262 _("Invalid task ID."));
266 else if (newvalue
== Py_None
)
270 PyErr_SetString (PyExc_TypeError
,
271 _("The value of `task' must be an integer or None."));
275 breakpoint_set_task (self_bp
->bp
, id
);
280 /* Python function which deletes the underlying GDB breakpoint. This
281 triggers the breakpoint_deleted observer which will call
282 gdbpy_breakpoint_deleted; that function cleans up the Python
286 bppy_delete_breakpoint (PyObject
*self
, PyObject
*args
)
288 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
290 BPPY_REQUIRE_VALID (self_bp
);
294 delete_breakpoint (self_bp
->bp
);
296 catch (const gdb_exception
&except
)
298 GDB_PY_HANDLE_EXCEPTION (except
);
305 /* Python function to set the ignore count of a breakpoint. */
307 bppy_set_ignore_count (PyObject
*self
, PyObject
*newvalue
, void *closure
)
309 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
312 BPPY_SET_REQUIRE_VALID (self_bp
);
314 if (newvalue
== NULL
)
316 PyErr_SetString (PyExc_TypeError
,
317 _("Cannot delete `ignore_count' attribute."));
320 else if (! PyInt_Check (newvalue
))
322 PyErr_SetString (PyExc_TypeError
,
323 _("The value of `ignore_count' must be an integer."));
327 if (! gdb_py_int_as_long (newvalue
, &value
))
335 set_ignore_count (self_bp
->number
, (int) value
, 0);
337 catch (const gdb_exception
&except
)
339 GDB_PY_SET_HANDLE_EXCEPTION (except
);
345 /* Python function to set the hit count of a breakpoint. */
347 bppy_set_hit_count (PyObject
*self
, PyObject
*newvalue
, void *closure
)
349 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
351 BPPY_SET_REQUIRE_VALID (self_bp
);
353 if (newvalue
== NULL
)
355 PyErr_SetString (PyExc_TypeError
,
356 _("Cannot delete `hit_count' attribute."));
363 if (! gdb_py_int_as_long (newvalue
, &value
))
368 PyErr_SetString (PyExc_AttributeError
,
369 _("The value of `hit_count' must be zero."));
374 self_bp
->bp
->hit_count
= 0;
379 /* Python function to get the location of a breakpoint. */
381 bppy_get_location (PyObject
*self
, void *closure
)
383 gdbpy_breakpoint_object
*obj
= (gdbpy_breakpoint_object
*) self
;
385 BPPY_REQUIRE_VALID (obj
);
387 if (obj
->bp
->type
!= bp_breakpoint
388 && obj
->bp
->type
!= bp_hardware_breakpoint
)
391 const char *str
= event_location_to_string (obj
->bp
->location
.get ());
394 return host_string_to_python_string (str
).release ();
397 /* Python function to get the breakpoint expression. */
399 bppy_get_expression (PyObject
*self
, void *closure
)
402 gdbpy_breakpoint_object
*obj
= (gdbpy_breakpoint_object
*) self
;
403 struct watchpoint
*wp
;
405 BPPY_REQUIRE_VALID (obj
);
407 if (!is_watchpoint (obj
->bp
))
410 wp
= (struct watchpoint
*) obj
->bp
;
412 str
= wp
->exp_string
;
416 return host_string_to_python_string (str
).release ();
419 /* Python function to get the condition expression of a breakpoint. */
421 bppy_get_condition (PyObject
*self
, void *closure
)
424 gdbpy_breakpoint_object
*obj
= (gdbpy_breakpoint_object
*) self
;
426 BPPY_REQUIRE_VALID (obj
);
428 str
= obj
->bp
->cond_string
;
432 return host_string_to_python_string (str
).release ();
435 /* Returns 0 on success. Returns -1 on error, with a python exception set.
439 bppy_set_condition (PyObject
*self
, PyObject
*newvalue
, void *closure
)
441 gdb::unique_xmalloc_ptr
<char> exp_holder
;
442 const char *exp
= NULL
;
443 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
444 struct gdb_exception except
;
446 BPPY_SET_REQUIRE_VALID (self_bp
);
448 if (newvalue
== NULL
)
450 PyErr_SetString (PyExc_TypeError
,
451 _("Cannot delete `condition' attribute."));
454 else if (newvalue
== Py_None
)
458 exp_holder
= python_string_to_host_string (newvalue
);
459 if (exp_holder
== NULL
)
461 exp
= exp_holder
.get ();
466 set_breakpoint_condition (self_bp
->bp
, exp
, 0, false);
468 catch (gdb_exception
&ex
)
470 except
= std::move (ex
);
473 GDB_PY_SET_HANDLE_EXCEPTION (except
);
478 /* Python function to get the commands attached to a breakpoint. */
480 bppy_get_commands (PyObject
*self
, void *closure
)
482 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
483 struct breakpoint
*bp
= self_bp
->bp
;
485 BPPY_REQUIRE_VALID (self_bp
);
487 if (! self_bp
->bp
->commands
)
492 current_uiout
->redirect (&stb
);
495 print_command_lines (current_uiout
, breakpoint_commands (bp
), 0);
497 catch (const gdb_exception
&except
)
499 current_uiout
->redirect (NULL
);
500 gdbpy_convert_exception (except
);
504 current_uiout
->redirect (NULL
);
505 return host_string_to_python_string (stb
.c_str ()).release ();
508 /* Set the commands attached to a breakpoint. Returns 0 on success.
509 Returns -1 on error, with a python exception set. */
511 bppy_set_commands (PyObject
*self
, PyObject
*newvalue
, void *closure
)
513 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
514 struct gdb_exception except
;
516 BPPY_SET_REQUIRE_VALID (self_bp
);
518 gdb::unique_xmalloc_ptr
<char> commands
519 (python_string_to_host_string (newvalue
));
520 if (commands
== nullptr)
526 char *save_ptr
= nullptr;
530 const char *result
= strtok_r (first
? commands
.get () : nullptr,
536 counted_command_line lines
= read_command_lines_1 (reader
, 1, nullptr);
537 breakpoint_set_commands (self_bp
->bp
, std::move (lines
));
539 catch (gdb_exception
&ex
)
541 except
= std::move (ex
);
544 GDB_PY_SET_HANDLE_EXCEPTION (except
);
549 /* Python function to get the breakpoint type. */
551 bppy_get_type (PyObject
*self
, void *closure
)
553 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
555 BPPY_REQUIRE_VALID (self_bp
);
557 return gdb_py_object_from_longest (self_bp
->bp
->type
).release ();
560 /* Python function to get the visibility of the breakpoint. */
563 bppy_get_visibility (PyObject
*self
, void *closure
)
565 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
567 BPPY_REQUIRE_VALID (self_bp
);
569 if (user_breakpoint_p (self_bp
->bp
))
575 /* Python function to determine if the breakpoint is a temporary
579 bppy_get_temporary (PyObject
*self
, void *closure
)
581 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
583 BPPY_REQUIRE_VALID (self_bp
);
585 if (self_bp
->bp
->disposition
== disp_del
586 || self_bp
->bp
->disposition
== disp_del_at_next_stop
)
592 /* Python function to determine if the breakpoint is a pending
596 bppy_get_pending (PyObject
*self
, void *closure
)
598 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
600 BPPY_REQUIRE_VALID (self_bp
);
602 if (is_watchpoint (self_bp
->bp
))
604 if (pending_breakpoint_p (self_bp
->bp
))
610 /* Python function to get the breakpoint's number. */
612 bppy_get_number (PyObject
*self
, void *closure
)
614 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
616 BPPY_REQUIRE_VALID (self_bp
);
618 return gdb_py_object_from_longest (self_bp
->number
).release ();
621 /* Python function to get the breakpoint's thread ID. */
623 bppy_get_thread (PyObject
*self
, void *closure
)
625 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
627 BPPY_REQUIRE_VALID (self_bp
);
629 if (self_bp
->bp
->thread
== -1)
632 return gdb_py_object_from_longest (self_bp
->bp
->thread
).release ();
635 /* Python function to get the breakpoint's task ID (in Ada). */
637 bppy_get_task (PyObject
*self
, void *closure
)
639 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
641 BPPY_REQUIRE_VALID (self_bp
);
643 if (self_bp
->bp
->task
== 0)
646 return gdb_py_object_from_longest (self_bp
->bp
->task
).release ();
649 /* Python function to get the breakpoint's hit count. */
651 bppy_get_hit_count (PyObject
*self
, void *closure
)
653 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
655 BPPY_REQUIRE_VALID (self_bp
);
657 return gdb_py_object_from_longest (self_bp
->bp
->hit_count
).release ();
660 /* Python function to get the breakpoint's ignore count. */
662 bppy_get_ignore_count (PyObject
*self
, void *closure
)
664 gdbpy_breakpoint_object
*self_bp
= (gdbpy_breakpoint_object
*) self
;
666 BPPY_REQUIRE_VALID (self_bp
);
668 return gdb_py_object_from_longest (self_bp
->bp
->ignore_count
).release ();
671 /* Internal function to validate the Python parameters/keywords
672 provided to bppy_init. */
675 bppy_init_validate_args (const char *spec
, char *source
,
676 char *function
, char *label
,
677 char *line
, enum bptype type
)
679 /* If spec is defined, ensure that none of the explicit location
680 keywords are also defined. */
683 if (source
!= NULL
|| function
!= NULL
|| label
!= NULL
|| line
!= NULL
)
685 PyErr_SetString (PyExc_RuntimeError
,
686 _("Breakpoints specified with spec cannot "
687 "have source, function, label or line defined."));
693 /* If spec isn't defined, ensure that the user is not trying to
694 define a watchpoint with an explicit location. */
695 if (type
== bp_watchpoint
)
697 PyErr_SetString (PyExc_RuntimeError
,
698 _("Watchpoints cannot be set by explicit "
699 "location parameters."));
704 /* Otherwise, ensure some explicit locations are defined. */
705 if (source
== NULL
&& function
== NULL
&& label
== NULL
708 PyErr_SetString (PyExc_RuntimeError
,
709 _("Neither spec nor explicit location set."));
712 /* Finally, if source is specified, ensure that line, label
713 or function are specified too. */
714 if (source
!= NULL
&& function
== NULL
&& label
== NULL
717 PyErr_SetString (PyExc_RuntimeError
,
718 _("Specifying a source must also include a "
719 "line, label or function."));
727 /* Python function to create a new breakpoint. */
729 bppy_init (PyObject
*self
, PyObject
*args
, PyObject
*kwargs
)
731 static const char *keywords
[] = { "spec", "type", "wp_class", "internal",
732 "temporary","source", "function",
733 "label", "line", "qualified", NULL
};
734 const char *spec
= NULL
;
735 enum bptype type
= bp_breakpoint
;
736 int access_type
= hw_write
;
737 PyObject
*internal
= NULL
;
738 PyObject
*temporary
= NULL
;
739 PyObject
*lineobj
= NULL
;;
741 int temporary_bp
= 0;
742 gdb::unique_xmalloc_ptr
<char> line
;
745 char *function
= NULL
;
746 PyObject
* qualified
= NULL
;
748 if (!gdb_PyArg_ParseTupleAndKeywords (args
, kwargs
, "|siiOOsssOO", keywords
,
749 &spec
, &type
, &access_type
,
752 &function
, &label
, &lineobj
,
759 if (PyInt_Check (lineobj
))
760 line
.reset (xstrprintf ("%ld", PyInt_AsLong (lineobj
)));
761 else if (PyString_Check (lineobj
))
762 line
= python_string_to_host_string (lineobj
);
765 PyErr_SetString (PyExc_RuntimeError
,
766 _("Line keyword should be an integer or a string. "));
773 internal_bp
= PyObject_IsTrue (internal
);
774 if (internal_bp
== -1)
778 if (temporary
!= NULL
)
780 temporary_bp
= PyObject_IsTrue (temporary
);
781 if (temporary_bp
== -1)
785 if (bppy_init_validate_args (spec
, source
, function
, label
, line
.get (),
789 bppy_pending_object
= (gdbpy_breakpoint_object
*) self
;
790 bppy_pending_object
->number
= -1;
791 bppy_pending_object
->bp
= NULL
;
798 case bp_hardware_breakpoint
:
800 event_location_up location
;
801 symbol_name_match_type func_name_match_type
802 = (qualified
!= NULL
&& PyObject_IsTrue (qualified
)
803 ? symbol_name_match_type::FULL
804 : symbol_name_match_type::WILD
);
808 gdb::unique_xmalloc_ptr
<char>
809 copy_holder (xstrdup (skip_spaces (spec
)));
810 const char *copy
= copy_holder
.get ();
812 location
= string_to_event_location (©
,
814 func_name_match_type
);
818 struct explicit_location explicit_loc
;
820 initialize_explicit_location (&explicit_loc
);
821 explicit_loc
.source_filename
= source
;
822 explicit_loc
.function_name
= function
;
823 explicit_loc
.label_name
= label
;
826 explicit_loc
.line_offset
=
827 linespec_parse_line_offset (line
.get ());
829 explicit_loc
.func_name_match_type
= func_name_match_type
;
831 location
= new_explicit_location (&explicit_loc
);
834 const struct breakpoint_ops
*ops
=
835 breakpoint_ops_for_event_location (location
.get (), false);
837 create_breakpoint (python_gdbarch
,
838 location
.get (), NULL
, -1, NULL
, false,
844 0, 1, internal_bp
, 0);
849 gdb::unique_xmalloc_ptr
<char>
850 copy_holder (xstrdup (skip_spaces (spec
)));
851 char *copy
= copy_holder
.get ();
853 if (access_type
== hw_write
)
854 watch_command_wrapper (copy
, 0, internal_bp
);
855 else if (access_type
== hw_access
)
856 awatch_command_wrapper (copy
, 0, internal_bp
);
857 else if (access_type
== hw_read
)
858 rwatch_command_wrapper (copy
, 0, internal_bp
);
860 error(_("Cannot understand watchpoint access type."));
864 error(_("Do not understand breakpoint type to set."));
867 catch (const gdb_exception
&except
)
869 bppy_pending_object
= NULL
;
870 gdbpy_convert_exception (except
);
874 BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object
*) self
);
881 build_bp_list (struct breakpoint
*b
, PyObject
*list
)
883 PyObject
*bp
= (PyObject
*) b
->py_bp_object
;
886 /* Not all breakpoints will have a companion Python object.
887 Only breakpoints that were created via bppy_new, or
888 breakpoints that were created externally and are tracked by
889 the Python Scripting API. */
891 iserr
= PyList_Append (list
, bp
);
899 /* Static function to return a tuple holding all breakpoints. */
902 gdbpy_breakpoints (PyObject
*self
, PyObject
*args
)
905 return PyTuple_New (0);
907 gdbpy_ref
<> list (PyList_New (0));
911 /* If iterate_over_breakpoints returns non NULL it signals an error
912 condition. In that case abandon building the list and return
914 auto callback
= [&] (breakpoint
*bp
)
916 return build_bp_list(bp
, list
.get ());
918 if (iterate_over_breakpoints (callback
) != NULL
)
921 return PyList_AsTuple (list
.get ());
924 /* Call the "stop" method (if implemented) in the breakpoint
925 class. If the method returns True, the inferior will be
926 stopped at the breakpoint. Otherwise the inferior will be
927 allowed to continue. */
929 enum ext_lang_bp_stop
930 gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn
*extlang
,
931 struct breakpoint
*b
)
934 struct gdbpy_breakpoint_object
*bp_obj
= b
->py_bp_object
;
935 PyObject
*py_bp
= (PyObject
*) bp_obj
;
936 struct gdbarch
*garch
;
939 return EXT_LANG_BP_STOP_UNSET
;
942 garch
= b
->gdbarch
? b
->gdbarch
: get_current_arch ();
944 gdbpy_enter
enter_py (garch
, current_language
);
946 if (bp_obj
->is_finish_bp
)
947 bpfinishpy_pre_stop_hook (bp_obj
);
949 if (PyObject_HasAttrString (py_bp
, stop_func
))
951 gdbpy_ref
<> result (PyObject_CallMethod (py_bp
, stop_func
, NULL
));
956 int evaluate
= PyObject_IsTrue (result
.get ());
959 gdbpy_print_stack ();
961 /* If the "stop" function returns False that means
962 the Python breakpoint wants GDB to continue. */
967 gdbpy_print_stack ();
970 if (bp_obj
->is_finish_bp
)
971 bpfinishpy_post_stop_hook (bp_obj
);
974 return EXT_LANG_BP_STOP_UNSET
;
975 return stop
? EXT_LANG_BP_STOP_YES
: EXT_LANG_BP_STOP_NO
;
978 /* Checks if the "stop" method exists in this breakpoint.
979 Used by condition_command to ensure mutual exclusion of breakpoint
983 gdbpy_breakpoint_has_cond (const struct extension_language_defn
*extlang
,
984 struct breakpoint
*b
)
987 struct gdbarch
*garch
;
989 if (b
->py_bp_object
== NULL
)
992 py_bp
= (PyObject
*) b
->py_bp_object
;
993 garch
= b
->gdbarch
? b
->gdbarch
: get_current_arch ();
995 gdbpy_enter
enter_py (garch
, current_language
);
996 return PyObject_HasAttrString (py_bp
, stop_func
);
1001 /* Event callback functions. */
1003 /* Callback that is used when a breakpoint is created. This function
1004 will create a new Python breakpoint object. */
1006 gdbpy_breakpoint_created (struct breakpoint
*bp
)
1008 gdbpy_breakpoint_object
*newbp
;
1010 if (!user_breakpoint_p (bp
) && bppy_pending_object
== NULL
)
1013 if (bp
->type
!= bp_breakpoint
1014 && bp
->type
!= bp_hardware_breakpoint
1015 && bp
->type
!= bp_watchpoint
1016 && bp
->type
!= bp_hardware_watchpoint
1017 && bp
->type
!= bp_read_watchpoint
1018 && bp
->type
!= bp_access_watchpoint
)
1021 struct gdbarch
*garch
= bp
->gdbarch
? bp
->gdbarch
: get_current_arch ();
1022 gdbpy_enter
enter_py (garch
, current_language
);
1024 if (bppy_pending_object
)
1026 newbp
= bppy_pending_object
;
1028 bppy_pending_object
= NULL
;
1031 newbp
= PyObject_New (gdbpy_breakpoint_object
, &breakpoint_object_type
);
1034 newbp
->number
= bp
->number
;
1036 newbp
->bp
->py_bp_object
= newbp
;
1037 newbp
->is_finish_bp
= 0;
1042 PyErr_SetString (PyExc_RuntimeError
,
1043 _("Error while creating breakpoint from GDB."));
1044 gdbpy_print_stack ();
1047 if (!evregpy_no_listeners_p (gdb_py_events
.breakpoint_created
))
1049 if (evpy_emit_event ((PyObject
*) newbp
,
1050 gdb_py_events
.breakpoint_created
) < 0)
1051 gdbpy_print_stack ();
1055 /* Callback that is used when a breakpoint is deleted. This will
1056 invalidate the corresponding Python object. */
1058 gdbpy_breakpoint_deleted (struct breakpoint
*b
)
1060 int num
= b
->number
;
1061 struct breakpoint
*bp
= NULL
;
1063 bp
= get_breakpoint (num
);
1066 struct gdbarch
*garch
= bp
->gdbarch
? bp
->gdbarch
: get_current_arch ();
1067 gdbpy_enter
enter_py (garch
, current_language
);
1069 gdbpy_ref
<gdbpy_breakpoint_object
> bp_obj (bp
->py_bp_object
);
1072 if (!evregpy_no_listeners_p (gdb_py_events
.breakpoint_deleted
))
1074 if (evpy_emit_event ((PyObject
*) bp_obj
.get (),
1075 gdb_py_events
.breakpoint_deleted
) < 0)
1076 gdbpy_print_stack ();
1085 /* Callback that is used when a breakpoint is modified. */
1088 gdbpy_breakpoint_modified (struct breakpoint
*b
)
1090 int num
= b
->number
;
1091 struct breakpoint
*bp
= NULL
;
1093 bp
= get_breakpoint (num
);
1096 struct gdbarch
*garch
= bp
->gdbarch
? bp
->gdbarch
: get_current_arch ();
1097 gdbpy_enter
enter_py (garch
, current_language
);
1099 PyObject
*bp_obj
= (PyObject
*) bp
->py_bp_object
;
1102 if (!evregpy_no_listeners_p (gdb_py_events
.breakpoint_modified
))
1104 if (evpy_emit_event (bp_obj
,
1105 gdb_py_events
.breakpoint_modified
) < 0)
1106 gdbpy_print_stack ();
1114 /* Initialize the Python breakpoint code. */
1116 gdbpy_initialize_breakpoints (void)
1120 breakpoint_object_type
.tp_new
= PyType_GenericNew
;
1121 if (PyType_Ready (&breakpoint_object_type
) < 0)
1124 if (gdb_pymodule_addobject (gdb_module
, "Breakpoint",
1125 (PyObject
*) &breakpoint_object_type
) < 0)
1128 gdb::observers::breakpoint_created
.attach (gdbpy_breakpoint_created
,
1130 gdb::observers::breakpoint_deleted
.attach (gdbpy_breakpoint_deleted
,
1132 gdb::observers::breakpoint_modified
.attach (gdbpy_breakpoint_modified
,
1135 /* Add breakpoint types constants. */
1136 for (i
= 0; pybp_codes
[i
].name
; ++i
)
1138 if (PyModule_AddIntConstant (gdb_module
, pybp_codes
[i
].name
,
1139 pybp_codes
[i
].code
) < 0)
1143 /* Add watchpoint types constants. */
1144 for (i
= 0; pybp_watch_types
[i
].name
; ++i
)
1146 if (PyModule_AddIntConstant (gdb_module
, pybp_watch_types
[i
].name
,
1147 pybp_watch_types
[i
].code
) < 0)
1156 /* Helper function that overrides this Python object's
1157 PyObject_GenericSetAttr to allow extra validation of the attribute
1161 local_setattro (PyObject
*self
, PyObject
*name
, PyObject
*v
)
1163 gdbpy_breakpoint_object
*obj
= (gdbpy_breakpoint_object
*) self
;
1164 gdb::unique_xmalloc_ptr
<char> attr (python_string_to_host_string (name
));
1169 /* If the attribute trying to be set is the "stop" method,
1170 but we already have a condition set in the CLI or other extension
1171 language, disallow this operation. */
1172 if (strcmp (attr
.get (), stop_func
) == 0)
1174 const struct extension_language_defn
*extlang
= NULL
;
1176 if (obj
->bp
->cond_string
!= NULL
)
1177 extlang
= get_ext_lang_defn (EXT_LANG_GDB
);
1178 if (extlang
== NULL
)
1179 extlang
= get_breakpoint_cond_ext_lang (obj
->bp
, EXT_LANG_PYTHON
);
1180 if (extlang
!= NULL
)
1182 std::string error_text
1183 = string_printf (_("Only one stop condition allowed. There is"
1184 " currently a %s stop condition defined for"
1185 " this breakpoint."),
1186 ext_lang_capitalized_name (extlang
));
1187 PyErr_SetString (PyExc_RuntimeError
, error_text
.c_str ());
1192 return PyObject_GenericSetAttr (self
, name
, v
);
1195 static gdb_PyGetSetDef breakpoint_object_getset
[] = {
1196 { "enabled", bppy_get_enabled
, bppy_set_enabled
,
1197 "Boolean telling whether the breakpoint is enabled.", NULL
},
1198 { "silent", bppy_get_silent
, bppy_set_silent
,
1199 "Boolean telling whether the breakpoint is silent.", NULL
},
1200 { "thread", bppy_get_thread
, bppy_set_thread
,
1201 "Thread ID for the breakpoint.\n\
1202 If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
1203 If the value is None, then this breakpoint is not thread-specific.\n\
1204 No other type of value can be used.", NULL
},
1205 { "task", bppy_get_task
, bppy_set_task
,
1206 "Thread ID for the breakpoint.\n\
1207 If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
1208 If the value is None, then this breakpoint is not task-specific.\n\
1209 No other type of value can be used.", NULL
},
1210 { "ignore_count", bppy_get_ignore_count
, bppy_set_ignore_count
,
1211 "Number of times this breakpoint should be automatically continued.",
1213 { "number", bppy_get_number
, NULL
,
1214 "Breakpoint's number assigned by GDB.", NULL
},
1215 { "hit_count", bppy_get_hit_count
, bppy_set_hit_count
,
1216 "Number of times the breakpoint has been hit.\n\
1217 Can be set to zero to clear the count. No other value is valid\n\
1218 when setting this property.", NULL
},
1219 { "location", bppy_get_location
, NULL
,
1220 "Location of the breakpoint, as specified by the user.", NULL
},
1221 { "expression", bppy_get_expression
, NULL
,
1222 "Expression of the breakpoint, as specified by the user.", NULL
},
1223 { "condition", bppy_get_condition
, bppy_set_condition
,
1224 "Condition of the breakpoint, as specified by the user,\
1225 or None if no condition set."},
1226 { "commands", bppy_get_commands
, bppy_set_commands
,
1227 "Commands of the breakpoint, as specified by the user."},
1228 { "type", bppy_get_type
, NULL
,
1229 "Type of breakpoint."},
1230 { "visible", bppy_get_visibility
, NULL
,
1231 "Whether the breakpoint is visible to the user."},
1232 { "temporary", bppy_get_temporary
, NULL
,
1233 "Whether this breakpoint is a temporary breakpoint."},
1234 { "pending", bppy_get_pending
, NULL
,
1235 "Whether this breakpoint is a pending breakpoint."},
1236 { NULL
} /* Sentinel. */
1239 static PyMethodDef breakpoint_object_methods
[] =
1241 { "is_valid", bppy_is_valid
, METH_NOARGS
,
1242 "Return true if this breakpoint is valid, false if not." },
1243 { "delete", bppy_delete_breakpoint
, METH_NOARGS
,
1244 "Delete the underlying GDB breakpoint." },
1245 { NULL
} /* Sentinel. */
1248 PyTypeObject breakpoint_object_type
=
1250 PyVarObject_HEAD_INIT (NULL
, 0)
1251 "gdb.Breakpoint", /*tp_name*/
1252 sizeof (gdbpy_breakpoint_object
), /*tp_basicsize*/
1261 0, /*tp_as_sequence*/
1262 0, /*tp_as_mapping*/
1267 (setattrofunc
)local_setattro
, /*tp_setattro */
1269 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
, /*tp_flags*/
1270 "GDB breakpoint object", /* tp_doc */
1271 0, /* tp_traverse */
1273 0, /* tp_richcompare */
1274 0, /* tp_weaklistoffset */
1276 0, /* tp_iternext */
1277 breakpoint_object_methods
, /* tp_methods */
1279 breakpoint_object_getset
, /* tp_getset */
1282 0, /* tp_descr_get */
1283 0, /* tp_descr_set */
1284 0, /* tp_dictoffset */
1285 bppy_init
, /* tp_init */