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