py-breakpoint.c revision 1.9 1 1.1 christos /* Python interface to breakpoints
2 1.1 christos
3 1.9 christos Copyright (C) 2008-2020 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This file is part of GDB.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1 christos #include "defs.h"
21 1.1 christos #include "value.h"
22 1.1 christos #include "python-internal.h"
23 1.1 christos #include "python.h"
24 1.1 christos #include "charset.h"
25 1.1 christos #include "breakpoint.h"
26 1.1 christos #include "gdbcmd.h"
27 1.1 christos #include "gdbthread.h"
28 1.8 christos #include "observable.h"
29 1.1 christos #include "cli/cli-script.h"
30 1.1 christos #include "ada-lang.h"
31 1.1 christos #include "arch-utils.h"
32 1.1 christos #include "language.h"
33 1.6 christos #include "location.h"
34 1.6 christos #include "py-event.h"
35 1.8 christos #include "linespec.h"
36 1.1 christos
37 1.1 christos /* Number of live breakpoints. */
38 1.1 christos static int bppy_live;
39 1.1 christos
40 1.1 christos /* Variables used to pass information between the Breakpoint
41 1.1 christos constructor and the breakpoint-created hook function. */
42 1.1 christos gdbpy_breakpoint_object *bppy_pending_object;
43 1.1 christos
44 1.1 christos /* Function that is called when a Python condition is evaluated. */
45 1.7 christos static const char stop_func[] = "stop";
46 1.1 christos
47 1.1 christos /* This is used to initialize various gdb.bp_* constants. */
48 1.1 christos struct pybp_code
49 1.1 christos {
50 1.1 christos /* The name. */
51 1.1 christos const char *name;
52 1.1 christos /* The code. */
53 1.1 christos int code;
54 1.1 christos };
55 1.1 christos
56 1.1 christos /* Entries related to the type of user set breakpoints. */
57 1.1 christos static struct pybp_code pybp_codes[] =
58 1.1 christos {
59 1.1 christos { "BP_NONE", bp_none},
60 1.1 christos { "BP_BREAKPOINT", bp_breakpoint},
61 1.1 christos { "BP_WATCHPOINT", bp_watchpoint},
62 1.1 christos { "BP_HARDWARE_WATCHPOINT", bp_hardware_watchpoint},
63 1.1 christos { "BP_READ_WATCHPOINT", bp_read_watchpoint},
64 1.1 christos { "BP_ACCESS_WATCHPOINT", bp_access_watchpoint},
65 1.1 christos {NULL} /* Sentinel. */
66 1.1 christos };
67 1.1 christos
68 1.1 christos /* Entries related to the type of watchpoint. */
69 1.1 christos static struct pybp_code pybp_watch_types[] =
70 1.1 christos {
71 1.1 christos { "WP_READ", hw_read},
72 1.1 christos { "WP_WRITE", hw_write},
73 1.1 christos { "WP_ACCESS", hw_access},
74 1.1 christos {NULL} /* Sentinel. */
75 1.1 christos };
76 1.1 christos
77 1.1 christos /* Python function which checks the validity of a breakpoint object. */
78 1.1 christos static PyObject *
79 1.1 christos bppy_is_valid (PyObject *self, PyObject *args)
80 1.1 christos {
81 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
82 1.1 christos
83 1.1 christos if (self_bp->bp)
84 1.1 christos Py_RETURN_TRUE;
85 1.1 christos Py_RETURN_FALSE;
86 1.1 christos }
87 1.1 christos
88 1.1 christos /* Python function to test whether or not the breakpoint is enabled. */
89 1.1 christos static PyObject *
90 1.1 christos bppy_get_enabled (PyObject *self, void *closure)
91 1.1 christos {
92 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
93 1.1 christos
94 1.1 christos BPPY_REQUIRE_VALID (self_bp);
95 1.1 christos if (! self_bp->bp)
96 1.1 christos Py_RETURN_FALSE;
97 1.1 christos if (self_bp->bp->enable_state == bp_enabled)
98 1.1 christos Py_RETURN_TRUE;
99 1.1 christos Py_RETURN_FALSE;
100 1.1 christos }
101 1.1 christos
102 1.1 christos /* Python function to test whether or not the breakpoint is silent. */
103 1.1 christos static PyObject *
104 1.1 christos bppy_get_silent (PyObject *self, void *closure)
105 1.1 christos {
106 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
107 1.1 christos
108 1.1 christos BPPY_REQUIRE_VALID (self_bp);
109 1.1 christos if (self_bp->bp->silent)
110 1.1 christos Py_RETURN_TRUE;
111 1.1 christos Py_RETURN_FALSE;
112 1.1 christos }
113 1.1 christos
114 1.1 christos /* Python function to set the enabled state of a breakpoint. */
115 1.1 christos static int
116 1.1 christos bppy_set_enabled (PyObject *self, PyObject *newvalue, void *closure)
117 1.1 christos {
118 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
119 1.1 christos int cmp;
120 1.1 christos
121 1.1 christos BPPY_SET_REQUIRE_VALID (self_bp);
122 1.1 christos
123 1.1 christos if (newvalue == NULL)
124 1.1 christos {
125 1.1 christos PyErr_SetString (PyExc_TypeError,
126 1.1 christos _("Cannot delete `enabled' attribute."));
127 1.1 christos
128 1.1 christos return -1;
129 1.1 christos }
130 1.1 christos else if (! PyBool_Check (newvalue))
131 1.1 christos {
132 1.1 christos PyErr_SetString (PyExc_TypeError,
133 1.1 christos _("The value of `enabled' must be a boolean."));
134 1.1 christos return -1;
135 1.1 christos }
136 1.1 christos
137 1.1 christos cmp = PyObject_IsTrue (newvalue);
138 1.1 christos if (cmp < 0)
139 1.1 christos return -1;
140 1.1 christos
141 1.9 christos try
142 1.1 christos {
143 1.1 christos if (cmp == 1)
144 1.1 christos enable_breakpoint (self_bp->bp);
145 1.1 christos else
146 1.1 christos disable_breakpoint (self_bp->bp);
147 1.1 christos }
148 1.9 christos catch (const gdb_exception &except)
149 1.5 christos {
150 1.5 christos GDB_PY_SET_HANDLE_EXCEPTION (except);
151 1.5 christos }
152 1.1 christos
153 1.1 christos return 0;
154 1.1 christos }
155 1.1 christos
156 1.1 christos /* Python function to set the 'silent' state of a breakpoint. */
157 1.1 christos static int
158 1.1 christos bppy_set_silent (PyObject *self, PyObject *newvalue, void *closure)
159 1.1 christos {
160 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
161 1.1 christos int cmp;
162 1.1 christos
163 1.1 christos BPPY_SET_REQUIRE_VALID (self_bp);
164 1.1 christos
165 1.1 christos if (newvalue == NULL)
166 1.1 christos {
167 1.1 christos PyErr_SetString (PyExc_TypeError,
168 1.1 christos _("Cannot delete `silent' attribute."));
169 1.1 christos return -1;
170 1.1 christos }
171 1.1 christos else if (! PyBool_Check (newvalue))
172 1.1 christos {
173 1.1 christos PyErr_SetString (PyExc_TypeError,
174 1.1 christos _("The value of `silent' must be a boolean."));
175 1.1 christos return -1;
176 1.1 christos }
177 1.1 christos
178 1.1 christos cmp = PyObject_IsTrue (newvalue);
179 1.1 christos if (cmp < 0)
180 1.1 christos return -1;
181 1.1 christos else
182 1.1 christos breakpoint_set_silent (self_bp->bp, cmp);
183 1.1 christos
184 1.1 christos return 0;
185 1.1 christos }
186 1.1 christos
187 1.1 christos /* Python function to set the thread of a breakpoint. */
188 1.1 christos static int
189 1.1 christos bppy_set_thread (PyObject *self, PyObject *newvalue, void *closure)
190 1.1 christos {
191 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
192 1.1 christos long id;
193 1.1 christos
194 1.1 christos BPPY_SET_REQUIRE_VALID (self_bp);
195 1.1 christos
196 1.1 christos if (newvalue == NULL)
197 1.1 christos {
198 1.1 christos PyErr_SetString (PyExc_TypeError,
199 1.1 christos _("Cannot delete `thread' attribute."));
200 1.1 christos return -1;
201 1.1 christos }
202 1.1 christos else if (PyInt_Check (newvalue))
203 1.1 christos {
204 1.1 christos if (! gdb_py_int_as_long (newvalue, &id))
205 1.1 christos return -1;
206 1.1 christos
207 1.6 christos if (!valid_global_thread_id (id))
208 1.1 christos {
209 1.1 christos PyErr_SetString (PyExc_RuntimeError,
210 1.1 christos _("Invalid thread ID."));
211 1.1 christos return -1;
212 1.1 christos }
213 1.1 christos }
214 1.1 christos else if (newvalue == Py_None)
215 1.1 christos id = -1;
216 1.1 christos else
217 1.1 christos {
218 1.1 christos PyErr_SetString (PyExc_TypeError,
219 1.1 christos _("The value of `thread' must be an integer or None."));
220 1.1 christos return -1;
221 1.1 christos }
222 1.1 christos
223 1.1 christos breakpoint_set_thread (self_bp->bp, id);
224 1.1 christos
225 1.1 christos return 0;
226 1.1 christos }
227 1.1 christos
228 1.1 christos /* Python function to set the (Ada) task of a breakpoint. */
229 1.1 christos static int
230 1.1 christos bppy_set_task (PyObject *self, PyObject *newvalue, void *closure)
231 1.1 christos {
232 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
233 1.1 christos long id;
234 1.1 christos int valid_id = 0;
235 1.1 christos
236 1.1 christos BPPY_SET_REQUIRE_VALID (self_bp);
237 1.1 christos
238 1.1 christos if (newvalue == NULL)
239 1.1 christos {
240 1.1 christos PyErr_SetString (PyExc_TypeError,
241 1.1 christos _("Cannot delete `task' attribute."));
242 1.1 christos return -1;
243 1.1 christos }
244 1.1 christos else if (PyInt_Check (newvalue))
245 1.1 christos {
246 1.1 christos if (! gdb_py_int_as_long (newvalue, &id))
247 1.1 christos return -1;
248 1.1 christos
249 1.9 christos try
250 1.1 christos {
251 1.1 christos valid_id = valid_task_id (id);
252 1.1 christos }
253 1.9 christos catch (const gdb_exception &except)
254 1.5 christos {
255 1.5 christos GDB_PY_SET_HANDLE_EXCEPTION (except);
256 1.5 christos }
257 1.1 christos
258 1.1 christos if (! valid_id)
259 1.1 christos {
260 1.1 christos PyErr_SetString (PyExc_RuntimeError,
261 1.1 christos _("Invalid task ID."));
262 1.1 christos return -1;
263 1.1 christos }
264 1.1 christos }
265 1.1 christos else if (newvalue == Py_None)
266 1.1 christos id = 0;
267 1.1 christos else
268 1.1 christos {
269 1.1 christos PyErr_SetString (PyExc_TypeError,
270 1.1 christos _("The value of `task' must be an integer or None."));
271 1.1 christos return -1;
272 1.1 christos }
273 1.1 christos
274 1.1 christos breakpoint_set_task (self_bp->bp, id);
275 1.1 christos
276 1.1 christos return 0;
277 1.1 christos }
278 1.1 christos
279 1.1 christos /* Python function which deletes the underlying GDB breakpoint. This
280 1.1 christos triggers the breakpoint_deleted observer which will call
281 1.1 christos gdbpy_breakpoint_deleted; that function cleans up the Python
282 1.1 christos sections. */
283 1.1 christos
284 1.1 christos static PyObject *
285 1.1 christos bppy_delete_breakpoint (PyObject *self, PyObject *args)
286 1.1 christos {
287 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
288 1.1 christos
289 1.1 christos BPPY_REQUIRE_VALID (self_bp);
290 1.1 christos
291 1.9 christos try
292 1.1 christos {
293 1.1 christos delete_breakpoint (self_bp->bp);
294 1.1 christos }
295 1.9 christos catch (const gdb_exception &except)
296 1.5 christos {
297 1.5 christos GDB_PY_HANDLE_EXCEPTION (except);
298 1.5 christos }
299 1.1 christos
300 1.1 christos Py_RETURN_NONE;
301 1.1 christos }
302 1.1 christos
303 1.1 christos
304 1.1 christos /* Python function to set the ignore count of a breakpoint. */
305 1.1 christos static int
306 1.1 christos bppy_set_ignore_count (PyObject *self, PyObject *newvalue, void *closure)
307 1.1 christos {
308 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
309 1.1 christos long value;
310 1.1 christos
311 1.1 christos BPPY_SET_REQUIRE_VALID (self_bp);
312 1.1 christos
313 1.1 christos if (newvalue == NULL)
314 1.1 christos {
315 1.1 christos PyErr_SetString (PyExc_TypeError,
316 1.1 christos _("Cannot delete `ignore_count' attribute."));
317 1.1 christos return -1;
318 1.1 christos }
319 1.1 christos else if (! PyInt_Check (newvalue))
320 1.1 christos {
321 1.1 christos PyErr_SetString (PyExc_TypeError,
322 1.1 christos _("The value of `ignore_count' must be an integer."));
323 1.1 christos return -1;
324 1.1 christos }
325 1.1 christos
326 1.1 christos if (! gdb_py_int_as_long (newvalue, &value))
327 1.1 christos return -1;
328 1.1 christos
329 1.1 christos if (value < 0)
330 1.1 christos value = 0;
331 1.1 christos
332 1.9 christos try
333 1.1 christos {
334 1.1 christos set_ignore_count (self_bp->number, (int) value, 0);
335 1.1 christos }
336 1.9 christos catch (const gdb_exception &except)
337 1.5 christos {
338 1.5 christos GDB_PY_SET_HANDLE_EXCEPTION (except);
339 1.5 christos }
340 1.1 christos
341 1.1 christos return 0;
342 1.1 christos }
343 1.1 christos
344 1.1 christos /* Python function to set the hit count of a breakpoint. */
345 1.1 christos static int
346 1.1 christos bppy_set_hit_count (PyObject *self, PyObject *newvalue, void *closure)
347 1.1 christos {
348 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
349 1.1 christos
350 1.1 christos BPPY_SET_REQUIRE_VALID (self_bp);
351 1.1 christos
352 1.1 christos if (newvalue == NULL)
353 1.1 christos {
354 1.1 christos PyErr_SetString (PyExc_TypeError,
355 1.1 christos _("Cannot delete `hit_count' attribute."));
356 1.1 christos return -1;
357 1.1 christos }
358 1.1 christos else
359 1.1 christos {
360 1.1 christos long value;
361 1.1 christos
362 1.1 christos if (! gdb_py_int_as_long (newvalue, &value))
363 1.1 christos return -1;
364 1.1 christos
365 1.1 christos if (value != 0)
366 1.1 christos {
367 1.1 christos PyErr_SetString (PyExc_AttributeError,
368 1.1 christos _("The value of `hit_count' must be zero."));
369 1.1 christos return -1;
370 1.1 christos }
371 1.1 christos }
372 1.1 christos
373 1.1 christos self_bp->bp->hit_count = 0;
374 1.1 christos
375 1.1 christos return 0;
376 1.1 christos }
377 1.1 christos
378 1.1 christos /* Python function to get the location of a breakpoint. */
379 1.1 christos static PyObject *
380 1.1 christos bppy_get_location (PyObject *self, void *closure)
381 1.1 christos {
382 1.1 christos gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
383 1.1 christos
384 1.1 christos BPPY_REQUIRE_VALID (obj);
385 1.1 christos
386 1.1 christos if (obj->bp->type != bp_breakpoint)
387 1.1 christos Py_RETURN_NONE;
388 1.1 christos
389 1.9 christos const char *str = event_location_to_string (obj->bp->location.get ());
390 1.1 christos if (! str)
391 1.1 christos str = "";
392 1.8 christos return host_string_to_python_string (str).release ();
393 1.1 christos }
394 1.1 christos
395 1.1 christos /* Python function to get the breakpoint expression. */
396 1.1 christos static PyObject *
397 1.1 christos bppy_get_expression (PyObject *self, void *closure)
398 1.1 christos {
399 1.7 christos const char *str;
400 1.1 christos gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
401 1.1 christos struct watchpoint *wp;
402 1.1 christos
403 1.1 christos BPPY_REQUIRE_VALID (obj);
404 1.1 christos
405 1.1 christos if (!is_watchpoint (obj->bp))
406 1.1 christos Py_RETURN_NONE;
407 1.1 christos
408 1.1 christos wp = (struct watchpoint *) obj->bp;
409 1.1 christos
410 1.1 christos str = wp->exp_string;
411 1.1 christos if (! str)
412 1.1 christos str = "";
413 1.1 christos
414 1.8 christos return host_string_to_python_string (str).release ();
415 1.1 christos }
416 1.1 christos
417 1.1 christos /* Python function to get the condition expression of a breakpoint. */
418 1.1 christos static PyObject *
419 1.1 christos bppy_get_condition (PyObject *self, void *closure)
420 1.1 christos {
421 1.1 christos char *str;
422 1.1 christos gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
423 1.1 christos
424 1.1 christos BPPY_REQUIRE_VALID (obj);
425 1.1 christos
426 1.1 christos str = obj->bp->cond_string;
427 1.1 christos if (! str)
428 1.1 christos Py_RETURN_NONE;
429 1.1 christos
430 1.8 christos return host_string_to_python_string (str).release ();
431 1.1 christos }
432 1.1 christos
433 1.1 christos /* Returns 0 on success. Returns -1 on error, with a python exception set.
434 1.1 christos */
435 1.1 christos
436 1.1 christos static int
437 1.1 christos bppy_set_condition (PyObject *self, PyObject *newvalue, void *closure)
438 1.1 christos {
439 1.7 christos gdb::unique_xmalloc_ptr<char> exp_holder;
440 1.7 christos const char *exp = NULL;
441 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
442 1.9 christos struct gdb_exception except;
443 1.1 christos
444 1.1 christos BPPY_SET_REQUIRE_VALID (self_bp);
445 1.1 christos
446 1.1 christos if (newvalue == NULL)
447 1.1 christos {
448 1.1 christos PyErr_SetString (PyExc_TypeError,
449 1.1 christos _("Cannot delete `condition' attribute."));
450 1.1 christos return -1;
451 1.1 christos }
452 1.1 christos else if (newvalue == Py_None)
453 1.1 christos exp = "";
454 1.1 christos else
455 1.1 christos {
456 1.7 christos exp_holder = python_string_to_host_string (newvalue);
457 1.7 christos if (exp_holder == NULL)
458 1.1 christos return -1;
459 1.7 christos exp = exp_holder.get ();
460 1.1 christos }
461 1.1 christos
462 1.9 christos try
463 1.1 christos {
464 1.1 christos set_breakpoint_condition (self_bp->bp, exp, 0);
465 1.1 christos }
466 1.9 christos catch (gdb_exception &ex)
467 1.5 christos {
468 1.9 christos except = std::move (ex);
469 1.5 christos }
470 1.1 christos
471 1.1 christos GDB_PY_SET_HANDLE_EXCEPTION (except);
472 1.1 christos
473 1.1 christos return 0;
474 1.1 christos }
475 1.1 christos
476 1.1 christos /* Python function to get the commands attached to a breakpoint. */
477 1.1 christos static PyObject *
478 1.1 christos bppy_get_commands (PyObject *self, void *closure)
479 1.1 christos {
480 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
481 1.1 christos struct breakpoint *bp = self_bp->bp;
482 1.1 christos
483 1.1 christos BPPY_REQUIRE_VALID (self_bp);
484 1.1 christos
485 1.1 christos if (! self_bp->bp->commands)
486 1.1 christos Py_RETURN_NONE;
487 1.1 christos
488 1.7 christos string_file stb;
489 1.1 christos
490 1.7 christos current_uiout->redirect (&stb);
491 1.9 christos try
492 1.1 christos {
493 1.1 christos print_command_lines (current_uiout, breakpoint_commands (bp), 0);
494 1.1 christos }
495 1.9 christos catch (const gdb_exception &except)
496 1.1 christos {
497 1.7 christos current_uiout->redirect (NULL);
498 1.1 christos gdbpy_convert_exception (except);
499 1.1 christos return NULL;
500 1.1 christos }
501 1.1 christos
502 1.7 christos current_uiout->redirect (NULL);
503 1.8 christos return host_string_to_python_string (stb.c_str ()).release ();
504 1.8 christos }
505 1.8 christos
506 1.8 christos /* Set the commands attached to a breakpoint. Returns 0 on success.
507 1.8 christos Returns -1 on error, with a python exception set. */
508 1.8 christos static int
509 1.8 christos bppy_set_commands (PyObject *self, PyObject *newvalue, void *closure)
510 1.8 christos {
511 1.8 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
512 1.9 christos struct gdb_exception except;
513 1.8 christos
514 1.8 christos BPPY_SET_REQUIRE_VALID (self_bp);
515 1.8 christos
516 1.8 christos gdb::unique_xmalloc_ptr<char> commands
517 1.8 christos (python_string_to_host_string (newvalue));
518 1.8 christos if (commands == nullptr)
519 1.8 christos return -1;
520 1.8 christos
521 1.9 christos try
522 1.8 christos {
523 1.8 christos bool first = true;
524 1.8 christos char *save_ptr = nullptr;
525 1.8 christos auto reader
526 1.8 christos = [&] ()
527 1.8 christos {
528 1.8 christos const char *result = strtok_r (first ? commands.get () : nullptr,
529 1.8 christos "\n", &save_ptr);
530 1.8 christos first = false;
531 1.8 christos return result;
532 1.8 christos };
533 1.8 christos
534 1.8 christos counted_command_line lines = read_command_lines_1 (reader, 1, nullptr);
535 1.8 christos breakpoint_set_commands (self_bp->bp, std::move (lines));
536 1.8 christos }
537 1.9 christos catch (gdb_exception &ex)
538 1.8 christos {
539 1.9 christos except = std::move (ex);
540 1.8 christos }
541 1.8 christos
542 1.8 christos GDB_PY_SET_HANDLE_EXCEPTION (except);
543 1.8 christos
544 1.8 christos return 0;
545 1.1 christos }
546 1.1 christos
547 1.1 christos /* Python function to get the breakpoint type. */
548 1.1 christos static PyObject *
549 1.1 christos bppy_get_type (PyObject *self, void *closure)
550 1.1 christos {
551 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
552 1.1 christos
553 1.1 christos BPPY_REQUIRE_VALID (self_bp);
554 1.1 christos
555 1.1 christos return PyInt_FromLong (self_bp->bp->type);
556 1.1 christos }
557 1.1 christos
558 1.1 christos /* Python function to get the visibility of the breakpoint. */
559 1.1 christos
560 1.1 christos static PyObject *
561 1.1 christos bppy_get_visibility (PyObject *self, void *closure)
562 1.1 christos {
563 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
564 1.1 christos
565 1.1 christos BPPY_REQUIRE_VALID (self_bp);
566 1.1 christos
567 1.6 christos if (user_breakpoint_p (self_bp->bp))
568 1.6 christos Py_RETURN_TRUE;
569 1.1 christos
570 1.6 christos Py_RETURN_FALSE;
571 1.1 christos }
572 1.1 christos
573 1.1 christos /* Python function to determine if the breakpoint is a temporary
574 1.1 christos breakpoint. */
575 1.1 christos
576 1.1 christos static PyObject *
577 1.1 christos bppy_get_temporary (PyObject *self, void *closure)
578 1.1 christos {
579 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
580 1.1 christos
581 1.1 christos BPPY_REQUIRE_VALID (self_bp);
582 1.1 christos
583 1.1 christos if (self_bp->bp->disposition == disp_del
584 1.1 christos || self_bp->bp->disposition == disp_del_at_next_stop)
585 1.1 christos Py_RETURN_TRUE;
586 1.1 christos
587 1.1 christos Py_RETURN_FALSE;
588 1.1 christos }
589 1.1 christos
590 1.6 christos /* Python function to determine if the breakpoint is a pending
591 1.6 christos breakpoint. */
592 1.6 christos
593 1.6 christos static PyObject *
594 1.6 christos bppy_get_pending (PyObject *self, void *closure)
595 1.6 christos {
596 1.6 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
597 1.6 christos
598 1.6 christos BPPY_REQUIRE_VALID (self_bp);
599 1.6 christos
600 1.6 christos if (is_watchpoint (self_bp->bp))
601 1.6 christos Py_RETURN_FALSE;
602 1.6 christos if (pending_breakpoint_p (self_bp->bp))
603 1.6 christos Py_RETURN_TRUE;
604 1.6 christos
605 1.6 christos Py_RETURN_FALSE;
606 1.6 christos }
607 1.6 christos
608 1.1 christos /* Python function to get the breakpoint's number. */
609 1.1 christos static PyObject *
610 1.1 christos bppy_get_number (PyObject *self, void *closure)
611 1.1 christos {
612 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
613 1.1 christos
614 1.1 christos BPPY_REQUIRE_VALID (self_bp);
615 1.1 christos
616 1.1 christos return PyInt_FromLong (self_bp->number);
617 1.1 christos }
618 1.1 christos
619 1.1 christos /* Python function to get the breakpoint's thread ID. */
620 1.1 christos static PyObject *
621 1.1 christos bppy_get_thread (PyObject *self, void *closure)
622 1.1 christos {
623 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
624 1.1 christos
625 1.1 christos BPPY_REQUIRE_VALID (self_bp);
626 1.1 christos
627 1.1 christos if (self_bp->bp->thread == -1)
628 1.1 christos Py_RETURN_NONE;
629 1.1 christos
630 1.1 christos return PyInt_FromLong (self_bp->bp->thread);
631 1.1 christos }
632 1.1 christos
633 1.1 christos /* Python function to get the breakpoint's task ID (in Ada). */
634 1.1 christos static PyObject *
635 1.1 christos bppy_get_task (PyObject *self, void *closure)
636 1.1 christos {
637 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
638 1.1 christos
639 1.1 christos BPPY_REQUIRE_VALID (self_bp);
640 1.1 christos
641 1.1 christos if (self_bp->bp->task == 0)
642 1.1 christos Py_RETURN_NONE;
643 1.1 christos
644 1.1 christos return PyInt_FromLong (self_bp->bp->task);
645 1.1 christos }
646 1.1 christos
647 1.1 christos /* Python function to get the breakpoint's hit count. */
648 1.1 christos static PyObject *
649 1.1 christos bppy_get_hit_count (PyObject *self, void *closure)
650 1.1 christos {
651 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
652 1.1 christos
653 1.1 christos BPPY_REQUIRE_VALID (self_bp);
654 1.1 christos
655 1.1 christos return PyInt_FromLong (self_bp->bp->hit_count);
656 1.1 christos }
657 1.1 christos
658 1.1 christos /* Python function to get the breakpoint's ignore count. */
659 1.1 christos static PyObject *
660 1.1 christos bppy_get_ignore_count (PyObject *self, void *closure)
661 1.1 christos {
662 1.1 christos gdbpy_breakpoint_object *self_bp = (gdbpy_breakpoint_object *) self;
663 1.1 christos
664 1.1 christos BPPY_REQUIRE_VALID (self_bp);
665 1.1 christos
666 1.1 christos return PyInt_FromLong (self_bp->bp->ignore_count);
667 1.1 christos }
668 1.1 christos
669 1.8 christos /* Internal function to validate the Python parameters/keywords
670 1.8 christos provided to bppy_init. */
671 1.8 christos
672 1.8 christos static int
673 1.8 christos bppy_init_validate_args (const char *spec, char *source,
674 1.8 christos char *function, char *label,
675 1.8 christos char *line, enum bptype type)
676 1.8 christos {
677 1.8 christos /* If spec is defined, ensure that none of the explicit location
678 1.8 christos keywords are also defined. */
679 1.8 christos if (spec != NULL)
680 1.8 christos {
681 1.8 christos if (source != NULL || function != NULL || label != NULL || line != NULL)
682 1.8 christos {
683 1.8 christos PyErr_SetString (PyExc_RuntimeError,
684 1.8 christos _("Breakpoints specified with spec cannot "
685 1.8 christos "have source, function, label or line defined."));
686 1.8 christos return -1;
687 1.8 christos }
688 1.8 christos }
689 1.8 christos else
690 1.8 christos {
691 1.8 christos /* If spec isn't defined, ensure that the user is not trying to
692 1.8 christos define a watchpoint with an explicit location. */
693 1.8 christos if (type == bp_watchpoint)
694 1.8 christos {
695 1.8 christos PyErr_SetString (PyExc_RuntimeError,
696 1.8 christos _("Watchpoints cannot be set by explicit "
697 1.8 christos "location parameters."));
698 1.8 christos return -1;
699 1.8 christos }
700 1.8 christos else
701 1.8 christos {
702 1.8 christos /* Otherwise, ensure some explicit locations are defined. */
703 1.8 christos if (source == NULL && function == NULL && label == NULL
704 1.8 christos && line == NULL)
705 1.8 christos {
706 1.8 christos PyErr_SetString (PyExc_RuntimeError,
707 1.8 christos _("Neither spec nor explicit location set."));
708 1.8 christos return -1;
709 1.8 christos }
710 1.8 christos /* Finally, if source is specified, ensure that line, label
711 1.8 christos or function are specified too. */
712 1.8 christos if (source != NULL && function == NULL && label == NULL
713 1.8 christos && line == NULL)
714 1.8 christos {
715 1.8 christos PyErr_SetString (PyExc_RuntimeError,
716 1.8 christos _("Specifying a source must also include a "
717 1.8 christos "line, label or function."));
718 1.8 christos return -1;
719 1.8 christos }
720 1.8 christos }
721 1.8 christos }
722 1.8 christos return 1;
723 1.8 christos }
724 1.8 christos
725 1.1 christos /* Python function to create a new breakpoint. */
726 1.1 christos static int
727 1.1 christos bppy_init (PyObject *self, PyObject *args, PyObject *kwargs)
728 1.1 christos {
729 1.7 christos static const char *keywords[] = { "spec", "type", "wp_class", "internal",
730 1.8 christos "temporary","source", "function",
731 1.8 christos "label", "line", "qualified", NULL };
732 1.8 christos const char *spec = NULL;
733 1.8 christos enum bptype type = bp_breakpoint;
734 1.1 christos int access_type = hw_write;
735 1.1 christos PyObject *internal = NULL;
736 1.1 christos PyObject *temporary = NULL;
737 1.8 christos PyObject *lineobj = NULL;;
738 1.1 christos int internal_bp = 0;
739 1.1 christos int temporary_bp = 0;
740 1.8 christos gdb::unique_xmalloc_ptr<char> line;
741 1.8 christos char *label = NULL;
742 1.8 christos char *source = NULL;
743 1.8 christos char *function = NULL;
744 1.8 christos PyObject * qualified = NULL;
745 1.1 christos
746 1.8 christos if (!gdb_PyArg_ParseTupleAndKeywords (args, kwargs, "|siiOOsssOO", keywords,
747 1.7 christos &spec, &type, &access_type,
748 1.8 christos &internal,
749 1.8 christos &temporary, &source,
750 1.8 christos &function, &label, &lineobj,
751 1.8 christos &qualified))
752 1.1 christos return -1;
753 1.1 christos
754 1.8 christos
755 1.8 christos if (lineobj != NULL)
756 1.8 christos {
757 1.8 christos if (PyInt_Check (lineobj))
758 1.8 christos line.reset (xstrprintf ("%ld", PyInt_AsLong (lineobj)));
759 1.8 christos else if (PyString_Check (lineobj))
760 1.8 christos line = python_string_to_host_string (lineobj);
761 1.8 christos else
762 1.8 christos {
763 1.8 christos PyErr_SetString (PyExc_RuntimeError,
764 1.8 christos _("Line keyword should be an integer or a string. "));
765 1.8 christos return -1;
766 1.8 christos }
767 1.8 christos }
768 1.8 christos
769 1.1 christos if (internal)
770 1.1 christos {
771 1.1 christos internal_bp = PyObject_IsTrue (internal);
772 1.1 christos if (internal_bp == -1)
773 1.1 christos return -1;
774 1.1 christos }
775 1.1 christos
776 1.1 christos if (temporary != NULL)
777 1.1 christos {
778 1.1 christos temporary_bp = PyObject_IsTrue (temporary);
779 1.1 christos if (temporary_bp == -1)
780 1.1 christos return -1;
781 1.1 christos }
782 1.1 christos
783 1.8 christos if (bppy_init_validate_args (spec, source, function, label, line.get (),
784 1.8 christos type) == -1)
785 1.8 christos return -1;
786 1.8 christos
787 1.1 christos bppy_pending_object = (gdbpy_breakpoint_object *) self;
788 1.1 christos bppy_pending_object->number = -1;
789 1.1 christos bppy_pending_object->bp = NULL;
790 1.1 christos
791 1.9 christos try
792 1.1 christos {
793 1.1 christos switch (type)
794 1.1 christos {
795 1.1 christos case bp_breakpoint:
796 1.1 christos {
797 1.8 christos event_location_up location;
798 1.8 christos symbol_name_match_type func_name_match_type
799 1.8 christos = (qualified != NULL && PyObject_IsTrue (qualified)
800 1.8 christos ? symbol_name_match_type::FULL
801 1.8 christos : symbol_name_match_type::WILD);
802 1.8 christos
803 1.8 christos if (spec != NULL)
804 1.8 christos {
805 1.8 christos gdb::unique_xmalloc_ptr<char>
806 1.8 christos copy_holder (xstrdup (skip_spaces (spec)));
807 1.8 christos const char *copy = copy_holder.get ();
808 1.8 christos
809 1.8 christos location = string_to_event_location (©,
810 1.8 christos current_language,
811 1.8 christos func_name_match_type);
812 1.8 christos }
813 1.8 christos else
814 1.8 christos {
815 1.8 christos struct explicit_location explicit_loc;
816 1.8 christos
817 1.8 christos initialize_explicit_location (&explicit_loc);
818 1.8 christos explicit_loc.source_filename = source;
819 1.8 christos explicit_loc.function_name = function;
820 1.8 christos explicit_loc.label_name = label;
821 1.8 christos
822 1.8 christos if (line != NULL)
823 1.8 christos explicit_loc.line_offset =
824 1.8 christos linespec_parse_line_offset (line.get ());
825 1.8 christos
826 1.8 christos explicit_loc.func_name_match_type = func_name_match_type;
827 1.8 christos
828 1.8 christos location = new_explicit_location (&explicit_loc);
829 1.8 christos }
830 1.8 christos
831 1.9 christos const struct breakpoint_ops *ops =
832 1.9 christos breakpoint_ops_for_event_location (location.get (), false);
833 1.9 christos
834 1.1 christos create_breakpoint (python_gdbarch,
835 1.7 christos location.get (), NULL, -1, NULL,
836 1.1 christos 0,
837 1.1 christos temporary_bp, bp_breakpoint,
838 1.1 christos 0,
839 1.1 christos AUTO_BOOLEAN_TRUE,
840 1.9 christos ops,
841 1.1 christos 0, 1, internal_bp, 0);
842 1.1 christos break;
843 1.1 christos }
844 1.8 christos case bp_watchpoint:
845 1.1 christos {
846 1.8 christos gdb::unique_xmalloc_ptr<char>
847 1.8 christos copy_holder (xstrdup (skip_spaces (spec)));
848 1.8 christos char *copy = copy_holder.get ();
849 1.8 christos
850 1.1 christos if (access_type == hw_write)
851 1.1 christos watch_command_wrapper (copy, 0, internal_bp);
852 1.1 christos else if (access_type == hw_access)
853 1.1 christos awatch_command_wrapper (copy, 0, internal_bp);
854 1.1 christos else if (access_type == hw_read)
855 1.1 christos rwatch_command_wrapper (copy, 0, internal_bp);
856 1.1 christos else
857 1.1 christos error(_("Cannot understand watchpoint access type."));
858 1.1 christos break;
859 1.1 christos }
860 1.1 christos default:
861 1.1 christos error(_("Do not understand breakpoint type to set."));
862 1.1 christos }
863 1.1 christos }
864 1.9 christos catch (const gdb_exception &except)
865 1.1 christos {
866 1.6 christos bppy_pending_object = NULL;
867 1.8 christos gdbpy_convert_exception (except);
868 1.1 christos return -1;
869 1.1 christos }
870 1.1 christos
871 1.1 christos BPPY_SET_REQUIRE_VALID ((gdbpy_breakpoint_object *) self);
872 1.1 christos return 0;
873 1.1 christos }
874 1.1 christos
875 1.1 christos
876 1.1 christos
878 1.9 christos static bool
879 1.1 christos build_bp_list (struct breakpoint *b, PyObject *list)
880 1.1 christos {
881 1.1 christos PyObject *bp = (PyObject *) b->py_bp_object;
882 1.1 christos int iserr = 0;
883 1.1 christos
884 1.1 christos /* Not all breakpoints will have a companion Python object.
885 1.1 christos Only breakpoints that were created via bppy_new, or
886 1.1 christos breakpoints that were created externally and are tracked by
887 1.1 christos the Python Scripting API. */
888 1.1 christos if (bp)
889 1.1 christos iserr = PyList_Append (list, bp);
890 1.1 christos
891 1.9 christos if (iserr == -1)
892 1.1 christos return true;
893 1.9 christos
894 1.1 christos return false;
895 1.1 christos }
896 1.1 christos
897 1.1 christos /* Static function to return a tuple holding all breakpoints. */
898 1.1 christos
899 1.1 christos PyObject *
900 1.1 christos gdbpy_breakpoints (PyObject *self, PyObject *args)
901 1.1 christos {
902 1.6 christos if (bppy_live == 0)
903 1.1 christos return PyTuple_New (0);
904 1.7 christos
905 1.7 christos gdbpy_ref<> list (PyList_New (0));
906 1.1 christos if (list == NULL)
907 1.1 christos return NULL;
908 1.6 christos
909 1.1 christos /* If iterate_over_breakpoints returns non NULL it signals an error
910 1.1 christos condition. In that case abandon building the list and return
911 1.9 christos NULL. */
912 1.9 christos auto callback = [&] (breakpoint *bp)
913 1.9 christos {
914 1.9 christos return build_bp_list(bp, list.get ());
915 1.9 christos };
916 1.7 christos if (iterate_over_breakpoints (callback) != NULL)
917 1.1 christos return NULL;
918 1.7 christos
919 1.1 christos return PyList_AsTuple (list.get ());
920 1.1 christos }
921 1.1 christos
922 1.1 christos /* Call the "stop" method (if implemented) in the breakpoint
923 1.1 christos class. If the method returns True, the inferior will be
924 1.1 christos stopped at the breakpoint. Otherwise the inferior will be
925 1.1 christos allowed to continue. */
926 1.3 christos
927 1.3 christos enum ext_lang_bp_stop
928 1.3 christos gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *extlang,
929 1.1 christos struct breakpoint *b)
930 1.3 christos {
931 1.3 christos int stop;
932 1.3 christos struct gdbpy_breakpoint_object *bp_obj = b->py_bp_object;
933 1.3 christos PyObject *py_bp = (PyObject *) bp_obj;
934 1.1 christos struct gdbarch *garch;
935 1.3 christos
936 1.3 christos if (bp_obj == NULL)
937 1.3 christos return EXT_LANG_BP_STOP_UNSET;
938 1.3 christos
939 1.3 christos stop = -1;
940 1.7 christos garch = b->gdbarch ? b->gdbarch : get_current_arch ();
941 1.7 christos
942 1.1 christos gdbpy_enter enter_py (garch, current_language);
943 1.1 christos
944 1.1 christos if (bp_obj->is_finish_bp)
945 1.1 christos bpfinishpy_pre_stop_hook (bp_obj);
946 1.1 christos
947 1.1 christos if (PyObject_HasAttrString (py_bp, stop_func))
948 1.7 christos {
949 1.1 christos gdbpy_ref<> result (PyObject_CallMethod (py_bp, stop_func, NULL));
950 1.3 christos
951 1.7 christos stop = 1;
952 1.1 christos if (result != NULL)
953 1.7 christos {
954 1.1 christos int evaluate = PyObject_IsTrue (result.get ());
955 1.1 christos
956 1.1 christos if (evaluate == -1)
957 1.1 christos gdbpy_print_stack ();
958 1.1 christos
959 1.1 christos /* If the "stop" function returns False that means
960 1.1 christos the Python breakpoint wants GDB to continue. */
961 1.1 christos if (! evaluate)
962 1.1 christos stop = 0;
963 1.1 christos }
964 1.1 christos else
965 1.1 christos gdbpy_print_stack ();
966 1.1 christos }
967 1.1 christos
968 1.1 christos if (bp_obj->is_finish_bp)
969 1.1 christos bpfinishpy_post_stop_hook (bp_obj);
970 1.3 christos
971 1.3 christos if (stop < 0)
972 1.3 christos return EXT_LANG_BP_STOP_UNSET;
973 1.1 christos return stop ? EXT_LANG_BP_STOP_YES : EXT_LANG_BP_STOP_NO;
974 1.1 christos }
975 1.1 christos
976 1.1 christos /* Checks if the "stop" method exists in this breakpoint.
977 1.1 christos Used by condition_command to ensure mutual exclusion of breakpoint
978 1.1 christos conditions. */
979 1.1 christos
980 1.3 christos int
981 1.3 christos gdbpy_breakpoint_has_cond (const struct extension_language_defn *extlang,
982 1.1 christos struct breakpoint *b)
983 1.3 christos {
984 1.3 christos PyObject *py_bp;
985 1.3 christos struct gdbarch *garch;
986 1.3 christos
987 1.3 christos if (b->py_bp_object == NULL)
988 1.3 christos return 0;
989 1.3 christos
990 1.3 christos py_bp = (PyObject *) b->py_bp_object;
991 1.1 christos garch = b->gdbarch ? b->gdbarch : get_current_arch ();
992 1.7 christos
993 1.7 christos gdbpy_enter enter_py (garch, current_language);
994 1.1 christos return PyObject_HasAttrString (py_bp, stop_func);
995 1.1 christos }
996 1.1 christos
997 1.1 christos
998 1.1 christos
1000 1.1 christos /* Event callback functions. */
1001 1.1 christos
1002 1.1 christos /* Callback that is used when a breakpoint is created. This function
1003 1.1 christos will create a new Python breakpoint object. */
1004 1.1 christos static void
1005 1.1 christos gdbpy_breakpoint_created (struct breakpoint *bp)
1006 1.1 christos {
1007 1.6 christos gdbpy_breakpoint_object *newbp;
1008 1.1 christos
1009 1.1 christos if (!user_breakpoint_p (bp) && bppy_pending_object == NULL)
1010 1.1 christos return;
1011 1.1 christos
1012 1.1 christos if (bp->type != bp_breakpoint
1013 1.1 christos && bp->type != bp_watchpoint
1014 1.1 christos && bp->type != bp_hardware_watchpoint
1015 1.1 christos && bp->type != bp_read_watchpoint
1016 1.1 christos && bp->type != bp_access_watchpoint)
1017 1.9 christos return;
1018 1.9 christos
1019 1.1 christos struct gdbarch *garch = bp->gdbarch ? bp->gdbarch : get_current_arch ();
1020 1.1 christos gdbpy_enter enter_py (garch, current_language);
1021 1.1 christos
1022 1.1 christos if (bppy_pending_object)
1023 1.9 christos {
1024 1.1 christos newbp = bppy_pending_object;
1025 1.1 christos Py_INCREF (newbp);
1026 1.1 christos bppy_pending_object = NULL;
1027 1.1 christos }
1028 1.1 christos else
1029 1.1 christos newbp = PyObject_New (gdbpy_breakpoint_object, &breakpoint_object_type);
1030 1.1 christos if (newbp)
1031 1.1 christos {
1032 1.1 christos newbp->number = bp->number;
1033 1.1 christos newbp->bp = bp;
1034 1.1 christos newbp->bp->py_bp_object = newbp;
1035 1.1 christos newbp->is_finish_bp = 0;
1036 1.1 christos ++bppy_live;
1037 1.1 christos }
1038 1.1 christos else
1039 1.1 christos {
1040 1.1 christos PyErr_SetString (PyExc_RuntimeError,
1041 1.1 christos _("Error while creating breakpoint from GDB."));
1042 1.1 christos gdbpy_print_stack ();
1043 1.6 christos }
1044 1.6 christos
1045 1.6 christos if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_created))
1046 1.6 christos {
1047 1.6 christos if (evpy_emit_event ((PyObject *) newbp,
1048 1.6 christos gdb_py_events.breakpoint_created) < 0)
1049 1.1 christos gdbpy_print_stack ();
1050 1.1 christos }
1051 1.1 christos }
1052 1.1 christos
1053 1.1 christos /* Callback that is used when a breakpoint is deleted. This will
1054 1.1 christos invalidate the corresponding Python object. */
1055 1.1 christos static void
1056 1.1 christos gdbpy_breakpoint_deleted (struct breakpoint *b)
1057 1.1 christos {
1058 1.1 christos int num = b->number;
1059 1.1 christos struct breakpoint *bp = NULL;
1060 1.1 christos
1061 1.1 christos bp = get_breakpoint (num);
1062 1.9 christos if (bp)
1063 1.9 christos {
1064 1.9 christos struct gdbarch *garch = bp->gdbarch ? bp->gdbarch : get_current_arch ();
1065 1.7 christos gdbpy_enter enter_py (garch, current_language);
1066 1.7 christos
1067 1.1 christos gdbpy_ref<gdbpy_breakpoint_object> bp_obj (bp->py_bp_object);
1068 1.6 christos if (bp_obj != NULL)
1069 1.6 christos {
1070 1.7 christos if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_deleted))
1071 1.6 christos {
1072 1.6 christos if (evpy_emit_event ((PyObject *) bp_obj.get (),
1073 1.6 christos gdb_py_events.breakpoint_deleted) < 0)
1074 1.6 christos gdbpy_print_stack ();
1075 1.1 christos }
1076 1.1 christos
1077 1.1 christos bp_obj->bp = NULL;
1078 1.1 christos --bppy_live;
1079 1.1 christos }
1080 1.1 christos }
1081 1.6 christos }
1082 1.6 christos
1083 1.6 christos /* Callback that is used when a breakpoint is modified. */
1084 1.6 christos
1085 1.6 christos static void
1086 1.6 christos gdbpy_breakpoint_modified (struct breakpoint *b)
1087 1.6 christos {
1088 1.6 christos int num = b->number;
1089 1.6 christos struct breakpoint *bp = NULL;
1090 1.6 christos
1091 1.6 christos bp = get_breakpoint (num);
1092 1.9 christos if (bp)
1093 1.9 christos {
1094 1.9 christos struct gdbarch *garch = bp->gdbarch ? bp->gdbarch : get_current_arch ();
1095 1.6 christos gdbpy_enter enter_py (garch, current_language);
1096 1.6 christos
1097 1.6 christos PyObject *bp_obj = (PyObject *) bp->py_bp_object;
1098 1.6 christos if (bp_obj)
1099 1.6 christos {
1100 1.6 christos if (!evregpy_no_listeners_p (gdb_py_events.breakpoint_modified))
1101 1.6 christos {
1102 1.6 christos if (evpy_emit_event (bp_obj,
1103 1.6 christos gdb_py_events.breakpoint_modified) < 0)
1104 1.6 christos gdbpy_print_stack ();
1105 1.6 christos }
1106 1.6 christos }
1107 1.6 christos }
1108 1.1 christos }
1109 1.1 christos
1110 1.1 christos
1111 1.1 christos
1113 1.1 christos /* Initialize the Python breakpoint code. */
1114 1.1 christos int
1115 1.1 christos gdbpy_initialize_breakpoints (void)
1116 1.1 christos {
1117 1.1 christos int i;
1118 1.1 christos
1119 1.1 christos breakpoint_object_type.tp_new = PyType_GenericNew;
1120 1.1 christos if (PyType_Ready (&breakpoint_object_type) < 0)
1121 1.1 christos return -1;
1122 1.1 christos
1123 1.1 christos if (gdb_pymodule_addobject (gdb_module, "Breakpoint",
1124 1.8 christos (PyObject *) &breakpoint_object_type) < 0)
1125 1.8 christos return -1;
1126 1.8 christos
1127 1.1 christos gdb::observers::breakpoint_created.attach (gdbpy_breakpoint_created);
1128 1.1 christos gdb::observers::breakpoint_deleted.attach (gdbpy_breakpoint_deleted);
1129 1.1 christos gdb::observers::breakpoint_modified.attach (gdbpy_breakpoint_modified);
1130 1.1 christos
1131 1.9 christos /* Add breakpoint types constants. */
1132 1.1 christos for (i = 0; pybp_codes[i].name; ++i)
1133 1.1 christos {
1134 1.1 christos if (PyModule_AddIntConstant (gdb_module, pybp_codes[i].name,
1135 1.1 christos pybp_codes[i].code) < 0)
1136 1.1 christos return -1;
1137 1.1 christos }
1138 1.1 christos
1139 1.9 christos /* Add watchpoint types constants. */
1140 1.1 christos for (i = 0; pybp_watch_types[i].name; ++i)
1141 1.1 christos {
1142 1.1 christos if (PyModule_AddIntConstant (gdb_module, pybp_watch_types[i].name,
1143 1.1 christos pybp_watch_types[i].code) < 0)
1144 1.1 christos return -1;
1145 1.1 christos }
1146 1.1 christos
1147 1.1 christos return 0;
1148 1.1 christos }
1149 1.1 christos
1150 1.1 christos
1151 1.1 christos
1153 1.1 christos /* Helper function that overrides this Python object's
1154 1.1 christos PyObject_GenericSetAttr to allow extra validation of the attribute
1155 1.1 christos being set. */
1156 1.1 christos
1157 1.7 christos static int
1158 1.1 christos local_setattro (PyObject *self, PyObject *name, PyObject *v)
1159 1.1 christos {
1160 1.1 christos gdbpy_breakpoint_object *obj = (gdbpy_breakpoint_object *) self;
1161 1.1 christos gdb::unique_xmalloc_ptr<char> attr (python_string_to_host_string (name));
1162 1.1 christos
1163 1.3 christos if (attr == NULL)
1164 1.3 christos return -1;
1165 1.7 christos
1166 1.3 christos /* If the attribute trying to be set is the "stop" method,
1167 1.3 christos but we already have a condition set in the CLI or other extension
1168 1.3 christos language, disallow this operation. */
1169 1.3 christos if (strcmp (attr.get (), stop_func) == 0)
1170 1.3 christos {
1171 1.3 christos const struct extension_language_defn *extlang = NULL;
1172 1.3 christos
1173 1.3 christos if (obj->bp->cond_string != NULL)
1174 1.3 christos extlang = get_ext_lang_defn (EXT_LANG_GDB);
1175 1.8 christos if (extlang == NULL)
1176 1.8 christos extlang = get_breakpoint_cond_ext_lang (obj->bp, EXT_LANG_PYTHON);
1177 1.8 christos if (extlang != NULL)
1178 1.8 christos {
1179 1.8 christos std::string error_text
1180 1.8 christos = string_printf (_("Only one stop condition allowed. There is"
1181 1.3 christos " currently a %s stop condition defined for"
1182 1.3 christos " this breakpoint."),
1183 1.1 christos ext_lang_capitalized_name (extlang));
1184 1.1 christos PyErr_SetString (PyExc_RuntimeError, error_text.c_str ());
1185 1.8 christos return -1;
1186 1.1 christos }
1187 1.1 christos }
1188 1.7 christos
1189 1.1 christos return PyObject_GenericSetAttr (self, name, v);
1190 1.1 christos }
1191 1.1 christos
1192 1.1 christos static gdb_PyGetSetDef breakpoint_object_getset[] = {
1193 1.1 christos { "enabled", bppy_get_enabled, bppy_set_enabled,
1194 1.1 christos "Boolean telling whether the breakpoint is enabled.", NULL },
1195 1.1 christos { "silent", bppy_get_silent, bppy_set_silent,
1196 1.1 christos "Boolean telling whether the breakpoint is silent.", NULL },
1197 1.1 christos { "thread", bppy_get_thread, bppy_set_thread,
1198 1.1 christos "Thread ID for the breakpoint.\n\
1199 1.1 christos If the value is a thread ID (integer), then this is a thread-specific breakpoint.\n\
1200 1.1 christos If the value is None, then this breakpoint is not thread-specific.\n\
1201 1.1 christos No other type of value can be used.", NULL },
1202 1.1 christos { "task", bppy_get_task, bppy_set_task,
1203 1.1 christos "Thread ID for the breakpoint.\n\
1204 1.1 christos If the value is a task ID (integer), then this is an Ada task-specific breakpoint.\n\
1205 1.1 christos If the value is None, then this breakpoint is not task-specific.\n\
1206 1.1 christos No other type of value can be used.", NULL },
1207 1.1 christos { "ignore_count", bppy_get_ignore_count, bppy_set_ignore_count,
1208 1.1 christos "Number of times this breakpoint should be automatically continued.",
1209 1.1 christos NULL },
1210 1.1 christos { "number", bppy_get_number, NULL,
1211 1.1 christos "Breakpoint's number assigned by GDB.", NULL },
1212 1.1 christos { "hit_count", bppy_get_hit_count, bppy_set_hit_count,
1213 1.1 christos "Number of times the breakpoint has been hit.\n\
1214 1.1 christos Can be set to zero to clear the count. No other value is valid\n\
1215 1.1 christos when setting this property.", NULL },
1216 1.1 christos { "location", bppy_get_location, NULL,
1217 1.1 christos "Location of the breakpoint, as specified by the user.", NULL},
1218 1.1 christos { "expression", bppy_get_expression, NULL,
1219 1.8 christos "Expression of the breakpoint, as specified by the user.", NULL},
1220 1.1 christos { "condition", bppy_get_condition, bppy_set_condition,
1221 1.1 christos "Condition of the breakpoint, as specified by the user,\
1222 1.1 christos or None if no condition set."},
1223 1.1 christos { "commands", bppy_get_commands, bppy_set_commands,
1224 1.1 christos "Commands of the breakpoint, as specified by the user."},
1225 1.1 christos { "type", bppy_get_type, NULL,
1226 1.1 christos "Type of breakpoint."},
1227 1.6 christos { "visible", bppy_get_visibility, NULL,
1228 1.6 christos "Whether the breakpoint is visible to the user."},
1229 1.1 christos { "temporary", bppy_get_temporary, NULL,
1230 1.1 christos "Whether this breakpoint is a temporary breakpoint."},
1231 1.1 christos { "pending", bppy_get_pending, NULL,
1232 1.1 christos "Whether this breakpoint is a pending breakpoint."},
1233 1.1 christos { NULL } /* Sentinel. */
1234 1.1 christos };
1235 1.1 christos
1236 1.1 christos static PyMethodDef breakpoint_object_methods[] =
1237 1.1 christos {
1238 1.1 christos { "is_valid", bppy_is_valid, METH_NOARGS,
1239 1.1 christos "Return true if this breakpoint is valid, false if not." },
1240 1.1 christos { "delete", bppy_delete_breakpoint, METH_NOARGS,
1241 1.1 christos "Delete the underlying GDB breakpoint." },
1242 1.1 christos { NULL } /* Sentinel. */
1243 1.1 christos };
1244 1.1 christos
1245 1.1 christos PyTypeObject breakpoint_object_type =
1246 1.1 christos {
1247 1.1 christos PyVarObject_HEAD_INIT (NULL, 0)
1248 1.1 christos "gdb.Breakpoint", /*tp_name*/
1249 1.1 christos sizeof (gdbpy_breakpoint_object), /*tp_basicsize*/
1250 1.1 christos 0, /*tp_itemsize*/
1251 1.1 christos 0, /*tp_dealloc*/
1252 1.1 christos 0, /*tp_print*/
1253 1.1 christos 0, /*tp_getattr*/
1254 1.1 christos 0, /*tp_setattr*/
1255 1.1 christos 0, /*tp_compare*/
1256 1.1 christos 0, /*tp_repr*/
1257 1.1 christos 0, /*tp_as_number*/
1258 1.1 christos 0, /*tp_as_sequence*/
1259 1.1 christos 0, /*tp_as_mapping*/
1260 1.1 christos 0, /*tp_hash */
1261 1.1 christos 0, /*tp_call*/
1262 1.1 christos 0, /*tp_str*/
1263 1.1 christos 0, /*tp_getattro*/
1264 1.1 christos (setattrofunc)local_setattro, /*tp_setattro */
1265 1.1 christos 0, /*tp_as_buffer*/
1266 1.1 christos Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
1267 1.1 christos "GDB breakpoint object", /* tp_doc */
1268 1.1 christos 0, /* tp_traverse */
1269 1.1 christos 0, /* tp_clear */
1270 1.1 christos 0, /* tp_richcompare */
1271 1.1 christos 0, /* tp_weaklistoffset */
1272 1.1 christos 0, /* tp_iter */
1273 1.1 christos 0, /* tp_iternext */
1274 1.1 christos breakpoint_object_methods, /* tp_methods */
1275 1.1 christos 0, /* tp_members */
1276 1.1 christos breakpoint_object_getset, /* tp_getset */
1277 1.1 christos 0, /* tp_base */
1278 1.1 christos 0, /* tp_dict */
1279 1.1 christos 0, /* tp_descr_get */
1280 1.1 christos 0, /* tp_descr_set */
1281 0, /* tp_dictoffset */
1282 bppy_init, /* tp_init */
1283 0, /* tp_alloc */
1284 };
1285