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