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