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