1 /* Python interface to inferiors. 2 3 Copyright (C) 2009-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 "gdbcore.h" 22 #include "gdbthread.h" 23 #include "inferior.h" 24 #include "objfiles.h" 25 #include "observable.h" 26 #include "python-internal.h" 27 #include "arch-utils.h" 28 #include "language.h" 29 #include "common/gdb_signals.h" 30 #include "py-event.h" 31 #include "py-stopevent.h" 32 33 struct threadlist_entry { 34 thread_object *thread_obj; 35 struct threadlist_entry *next; 36 }; 37 38 struct inferior_object 39 { 40 PyObject_HEAD 41 42 /* The inferior we represent. */ 43 struct inferior *inferior; 44 45 /* thread_object instances under this inferior. This list owns a 46 reference to each object it contains. */ 47 struct threadlist_entry *threads; 48 49 /* Number of threads in the list. */ 50 int nthreads; 51 }; 52 53 extern PyTypeObject inferior_object_type 54 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("inferior_object"); 55 56 static const struct inferior_data *infpy_inf_data_key; 57 58 typedef struct { 59 PyObject_HEAD 60 void *buffer; 61 62 /* These are kept just for mbpy_str. */ 63 CORE_ADDR addr; 64 CORE_ADDR length; 65 } membuf_object; 66 67 extern PyTypeObject membuf_object_type 68 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("membuf_object"); 69 70 /* Require that INFERIOR be a valid inferior ID. */ 71 #define INFPY_REQUIRE_VALID(Inferior) \ 72 do { \ 73 if (!Inferior->inferior) \ 74 { \ 75 PyErr_SetString (PyExc_RuntimeError, \ 76 _("Inferior no longer exists.")); \ 77 return NULL; \ 78 } \ 79 } while (0) 80 81 static void 82 python_on_normal_stop (struct bpstats *bs, int print_frame) 83 { 84 enum gdb_signal stop_signal; 85 86 if (!gdb_python_initialized) 87 return; 88 89 if (inferior_ptid == null_ptid) 90 return; 91 92 stop_signal = inferior_thread ()->suspend.stop_signal; 93 94 gdbpy_enter enter_py (get_current_arch (), current_language); 95 96 if (emit_stop_event (bs, stop_signal) < 0) 97 gdbpy_print_stack (); 98 } 99 100 static void 101 python_on_resume (ptid_t ptid) 102 { 103 if (!gdb_python_initialized) 104 return; 105 106 gdbpy_enter enter_py (target_gdbarch (), current_language); 107 108 if (emit_continue_event (ptid) < 0) 109 gdbpy_print_stack (); 110 } 111 112 /* Callback, registered as an observer, that notifies Python listeners 113 when an inferior function call is about to be made. */ 114 115 static void 116 python_on_inferior_call_pre (ptid_t thread, CORE_ADDR address) 117 { 118 gdbpy_enter enter_py (target_gdbarch (), current_language); 119 120 if (emit_inferior_call_event (INFERIOR_CALL_PRE, thread, address) < 0) 121 gdbpy_print_stack (); 122 } 123 124 /* Callback, registered as an observer, that notifies Python listeners 125 when an inferior function call has completed. */ 126 127 static void 128 python_on_inferior_call_post (ptid_t thread, CORE_ADDR address) 129 { 130 gdbpy_enter enter_py (target_gdbarch (), current_language); 131 132 if (emit_inferior_call_event (INFERIOR_CALL_POST, thread, address) < 0) 133 gdbpy_print_stack (); 134 } 135 136 /* Callback, registered as an observer, that notifies Python listeners 137 when a part of memory has been modified by user action (eg via a 138 'set' command). */ 139 140 static void 141 python_on_memory_change (struct inferior *inferior, CORE_ADDR addr, ssize_t len, const bfd_byte *data) 142 { 143 gdbpy_enter enter_py (target_gdbarch (), current_language); 144 145 if (emit_memory_changed_event (addr, len) < 0) 146 gdbpy_print_stack (); 147 } 148 149 /* Callback, registered as an observer, that notifies Python listeners 150 when a register has been modified by user action (eg via a 'set' 151 command). */ 152 153 static void 154 python_on_register_change (struct frame_info *frame, int regnum) 155 { 156 gdbpy_enter enter_py (target_gdbarch (), current_language); 157 158 if (emit_register_changed_event (frame, regnum) < 0) 159 gdbpy_print_stack (); 160 } 161 162 static void 163 python_inferior_exit (struct inferior *inf) 164 { 165 const LONGEST *exit_code = NULL; 166 167 if (!gdb_python_initialized) 168 return; 169 170 gdbpy_enter enter_py (target_gdbarch (), current_language); 171 172 if (inf->has_exit_code) 173 exit_code = &inf->exit_code; 174 175 if (emit_exited_event (exit_code, inf) < 0) 176 gdbpy_print_stack (); 177 } 178 179 /* Callback used to notify Python listeners about new objfiles loaded in the 180 inferior. OBJFILE may be NULL which means that the objfile list has been 181 cleared (emptied). */ 182 183 static void 184 python_new_objfile (struct objfile *objfile) 185 { 186 if (!gdb_python_initialized) 187 return; 188 189 gdbpy_enter enter_py (objfile != NULL 190 ? get_objfile_arch (objfile) 191 : target_gdbarch (), 192 current_language); 193 194 if (objfile == NULL) 195 { 196 if (emit_clear_objfiles_event () < 0) 197 gdbpy_print_stack (); 198 } 199 else 200 { 201 if (emit_new_objfile_event (objfile) < 0) 202 gdbpy_print_stack (); 203 } 204 } 205 206 /* Return a reference to the Python object of type Inferior 207 representing INFERIOR. If the object has already been created, 208 return it and increment the reference count, otherwise, create it. 209 Return NULL on failure. */ 210 211 gdbpy_ref<inferior_object> 212 inferior_to_inferior_object (struct inferior *inferior) 213 { 214 inferior_object *inf_obj; 215 216 inf_obj = (inferior_object *) inferior_data (inferior, infpy_inf_data_key); 217 if (!inf_obj) 218 { 219 inf_obj = PyObject_New (inferior_object, &inferior_object_type); 220 if (!inf_obj) 221 return NULL; 222 223 inf_obj->inferior = inferior; 224 inf_obj->threads = NULL; 225 inf_obj->nthreads = 0; 226 227 /* PyObject_New initializes the new object with a refcount of 1. This 228 counts for the reference we are keeping in the inferior data. */ 229 set_inferior_data (inferior, infpy_inf_data_key, inf_obj); 230 } 231 232 /* We are returning a new reference. */ 233 gdb_assert (inf_obj != nullptr); 234 return gdbpy_ref<inferior_object>::new_reference (inf_obj); 235 } 236 237 /* Called when a new inferior is created. Notifies any Python event 238 listeners. */ 239 static void 240 python_new_inferior (struct inferior *inf) 241 { 242 if (!gdb_python_initialized) 243 return; 244 245 gdbpy_enter enter_py (python_gdbarch, python_language); 246 247 if (evregpy_no_listeners_p (gdb_py_events.new_inferior)) 248 return; 249 250 gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (inf); 251 if (inf_obj == NULL) 252 { 253 gdbpy_print_stack (); 254 return; 255 } 256 257 gdbpy_ref<> event = create_event_object (&new_inferior_event_object_type); 258 if (event == NULL 259 || evpy_add_attribute (event.get (), "inferior", 260 (PyObject *) inf_obj.get ()) < 0 261 || evpy_emit_event (event.get (), gdb_py_events.new_inferior) < 0) 262 gdbpy_print_stack (); 263 } 264 265 /* Called when an inferior is removed. Notifies any Python event 266 listeners. */ 267 static void 268 python_inferior_deleted (struct inferior *inf) 269 { 270 if (!gdb_python_initialized) 271 return; 272 273 gdbpy_enter enter_py (python_gdbarch, python_language); 274 275 if (evregpy_no_listeners_p (gdb_py_events.inferior_deleted)) 276 return; 277 278 gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (inf); 279 if (inf_obj == NULL) 280 { 281 gdbpy_print_stack (); 282 return; 283 } 284 285 gdbpy_ref<> event = create_event_object (&inferior_deleted_event_object_type); 286 if (event == NULL 287 || evpy_add_attribute (event.get (), "inferior", 288 (PyObject *) inf_obj.get ()) < 0 289 || evpy_emit_event (event.get (), gdb_py_events.inferior_deleted) < 0) 290 gdbpy_print_stack (); 291 } 292 293 gdbpy_ref<> 294 thread_to_thread_object (thread_info *thr) 295 { 296 gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (thr->inf); 297 if (inf_obj == NULL) 298 return NULL; 299 300 for (threadlist_entry *thread = inf_obj->threads; 301 thread != NULL; 302 thread = thread->next) 303 if (thread->thread_obj->thread == thr) 304 return gdbpy_ref<>::new_reference ((PyObject *) thread->thread_obj); 305 306 PyErr_SetString (PyExc_SystemError, 307 _("could not find gdb thread object")); 308 return NULL; 309 } 310 311 static void 312 add_thread_object (struct thread_info *tp) 313 { 314 thread_object *thread_obj; 315 inferior_object *inf_obj; 316 struct threadlist_entry *entry; 317 318 if (!gdb_python_initialized) 319 return; 320 321 gdbpy_enter enter_py (python_gdbarch, python_language); 322 323 thread_obj = create_thread_object (tp); 324 if (!thread_obj) 325 { 326 gdbpy_print_stack (); 327 return; 328 } 329 330 inf_obj = (inferior_object *) thread_obj->inf_obj; 331 332 entry = XNEW (struct threadlist_entry); 333 entry->thread_obj = thread_obj; 334 entry->next = inf_obj->threads; 335 336 inf_obj->threads = entry; 337 inf_obj->nthreads++; 338 339 if (evregpy_no_listeners_p (gdb_py_events.new_thread)) 340 return; 341 342 gdbpy_ref<> event = create_thread_event_object (&new_thread_event_object_type, 343 (PyObject *) thread_obj); 344 if (event == NULL 345 || evpy_emit_event (event.get (), gdb_py_events.new_thread) < 0) 346 gdbpy_print_stack (); 347 } 348 349 static void 350 delete_thread_object (struct thread_info *tp, int ignore) 351 { 352 struct threadlist_entry **entry, *tmp; 353 354 if (!gdb_python_initialized) 355 return; 356 357 gdbpy_enter enter_py (python_gdbarch, python_language); 358 359 gdbpy_ref<inferior_object> inf_obj = inferior_to_inferior_object (tp->inf); 360 if (inf_obj == NULL) 361 return; 362 363 /* Find thread entry in its inferior's thread_list. */ 364 for (entry = &inf_obj->threads; *entry != NULL; entry = 365 &(*entry)->next) 366 if ((*entry)->thread_obj->thread == tp) 367 break; 368 369 if (!*entry) 370 return; 371 372 tmp = *entry; 373 tmp->thread_obj->thread = NULL; 374 375 *entry = (*entry)->next; 376 inf_obj->nthreads--; 377 378 Py_DECREF (tmp->thread_obj); 379 xfree (tmp); 380 } 381 382 static PyObject * 383 infpy_threads (PyObject *self, PyObject *args) 384 { 385 int i; 386 struct threadlist_entry *entry; 387 inferior_object *inf_obj = (inferior_object *) self; 388 PyObject *tuple; 389 390 INFPY_REQUIRE_VALID (inf_obj); 391 392 TRY 393 { 394 update_thread_list (); 395 } 396 CATCH (except, RETURN_MASK_ALL) 397 { 398 GDB_PY_HANDLE_EXCEPTION (except); 399 } 400 END_CATCH 401 402 tuple = PyTuple_New (inf_obj->nthreads); 403 if (!tuple) 404 return NULL; 405 406 for (i = 0, entry = inf_obj->threads; i < inf_obj->nthreads; 407 i++, entry = entry->next) 408 { 409 Py_INCREF (entry->thread_obj); 410 PyTuple_SET_ITEM (tuple, i, (PyObject *) entry->thread_obj); 411 } 412 413 return tuple; 414 } 415 416 static PyObject * 417 infpy_get_num (PyObject *self, void *closure) 418 { 419 inferior_object *inf = (inferior_object *) self; 420 421 INFPY_REQUIRE_VALID (inf); 422 423 return PyLong_FromLong (inf->inferior->num); 424 } 425 426 static PyObject * 427 infpy_get_pid (PyObject *self, void *closure) 428 { 429 inferior_object *inf = (inferior_object *) self; 430 431 INFPY_REQUIRE_VALID (inf); 432 433 return PyLong_FromLong (inf->inferior->pid); 434 } 435 436 static PyObject * 437 infpy_get_was_attached (PyObject *self, void *closure) 438 { 439 inferior_object *inf = (inferior_object *) self; 440 441 INFPY_REQUIRE_VALID (inf); 442 if (inf->inferior->attach_flag) 443 Py_RETURN_TRUE; 444 Py_RETURN_FALSE; 445 } 446 447 /* Getter of gdb.Inferior.progspace. */ 448 449 static PyObject * 450 infpy_get_progspace (PyObject *self, void *closure) 451 { 452 inferior_object *inf = (inferior_object *) self; 453 454 INFPY_REQUIRE_VALID (inf); 455 456 program_space *pspace = inf->inferior->pspace; 457 gdb_assert (pspace != nullptr); 458 459 return pspace_to_pspace_object (pspace).release (); 460 } 461 462 static int 463 build_inferior_list (struct inferior *inf, void *arg) 464 { 465 PyObject *list = (PyObject *) arg; 466 gdbpy_ref<inferior_object> inferior = inferior_to_inferior_object (inf); 467 468 if (inferior == NULL) 469 return 0; 470 471 return PyList_Append (list, (PyObject *) inferior.get ()) ? 1 : 0; 472 } 473 474 /* Implementation of gdb.inferiors () -> (gdb.Inferior, ...). 475 Returns a tuple of all inferiors. */ 476 PyObject * 477 gdbpy_inferiors (PyObject *unused, PyObject *unused2) 478 { 479 gdbpy_ref<> list (PyList_New (0)); 480 if (list == NULL) 481 return NULL; 482 483 if (iterate_over_inferiors (build_inferior_list, list.get ())) 484 return NULL; 485 486 return PyList_AsTuple (list.get ()); 487 } 488 489 /* Membuf and memory manipulation. */ 490 491 /* Implementation of Inferior.read_memory (address, length). 492 Returns a Python buffer object with LENGTH bytes of the inferior's 493 memory at ADDRESS. Both arguments are integers. Returns NULL on error, 494 with a python exception set. */ 495 static PyObject * 496 infpy_read_memory (PyObject *self, PyObject *args, PyObject *kw) 497 { 498 CORE_ADDR addr, length; 499 gdb::unique_xmalloc_ptr<gdb_byte> buffer; 500 PyObject *addr_obj, *length_obj, *result; 501 static const char *keywords[] = { "address", "length", NULL }; 502 503 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "OO", keywords, 504 &addr_obj, &length_obj)) 505 return NULL; 506 507 if (get_addr_from_python (addr_obj, &addr) < 0 508 || get_addr_from_python (length_obj, &length) < 0) 509 return NULL; 510 511 TRY 512 { 513 buffer.reset ((gdb_byte *) xmalloc (length)); 514 515 read_memory (addr, buffer.get (), length); 516 } 517 CATCH (except, RETURN_MASK_ALL) 518 { 519 GDB_PY_HANDLE_EXCEPTION (except); 520 } 521 END_CATCH 522 523 gdbpy_ref<membuf_object> membuf_obj (PyObject_New (membuf_object, 524 &membuf_object_type)); 525 if (membuf_obj == NULL) 526 return NULL; 527 528 membuf_obj->buffer = buffer.release (); 529 membuf_obj->addr = addr; 530 membuf_obj->length = length; 531 532 #ifdef IS_PY3K 533 result = PyMemoryView_FromObject ((PyObject *) membuf_obj.get ()); 534 #else 535 result = PyBuffer_FromReadWriteObject ((PyObject *) membuf_obj.get (), 0, 536 Py_END_OF_BUFFER); 537 #endif 538 539 return result; 540 } 541 542 /* Implementation of Inferior.write_memory (address, buffer [, length]). 543 Writes the contents of BUFFER (a Python object supporting the read 544 buffer protocol) at ADDRESS in the inferior's memory. Write LENGTH 545 bytes from BUFFER, or its entire contents if the argument is not 546 provided. The function returns nothing. Returns NULL on error, with 547 a python exception set. */ 548 static PyObject * 549 infpy_write_memory (PyObject *self, PyObject *args, PyObject *kw) 550 { 551 struct gdb_exception except = exception_none; 552 Py_ssize_t buf_len; 553 const gdb_byte *buffer; 554 CORE_ADDR addr, length; 555 PyObject *addr_obj, *length_obj = NULL; 556 static const char *keywords[] = { "address", "buffer", "length", NULL }; 557 #ifdef IS_PY3K 558 Py_buffer pybuf; 559 560 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "Os*|O", keywords, 561 &addr_obj, &pybuf, &length_obj)) 562 return NULL; 563 564 buffer = (const gdb_byte *) pybuf.buf; 565 buf_len = pybuf.len; 566 #else 567 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "Os#|O", keywords, 568 &addr_obj, &buffer, &buf_len, 569 &length_obj)) 570 return NULL; 571 572 buffer = (const gdb_byte *) buffer; 573 #endif 574 575 if (get_addr_from_python (addr_obj, &addr) < 0) 576 goto fail; 577 578 if (!length_obj) 579 length = buf_len; 580 else if (get_addr_from_python (length_obj, &length) < 0) 581 goto fail; 582 583 TRY 584 { 585 write_memory_with_notification (addr, buffer, length); 586 } 587 CATCH (ex, RETURN_MASK_ALL) 588 { 589 except = ex; 590 } 591 END_CATCH 592 593 #ifdef IS_PY3K 594 PyBuffer_Release (&pybuf); 595 #endif 596 GDB_PY_HANDLE_EXCEPTION (except); 597 598 Py_RETURN_NONE; 599 600 fail: 601 #ifdef IS_PY3K 602 PyBuffer_Release (&pybuf); 603 #endif 604 return NULL; 605 } 606 607 /* Destructor of Membuf objects. */ 608 static void 609 mbpy_dealloc (PyObject *self) 610 { 611 xfree (((membuf_object *) self)->buffer); 612 Py_TYPE (self)->tp_free (self); 613 } 614 615 /* Return a description of the Membuf object. */ 616 static PyObject * 617 mbpy_str (PyObject *self) 618 { 619 membuf_object *membuf_obj = (membuf_object *) self; 620 621 return PyString_FromFormat (_("Memory buffer for address %s, \ 622 which is %s bytes long."), 623 paddress (python_gdbarch, membuf_obj->addr), 624 pulongest (membuf_obj->length)); 625 } 626 627 #ifdef IS_PY3K 628 629 static int 630 get_buffer (PyObject *self, Py_buffer *buf, int flags) 631 { 632 membuf_object *membuf_obj = (membuf_object *) self; 633 int ret; 634 635 ret = PyBuffer_FillInfo (buf, self, membuf_obj->buffer, 636 membuf_obj->length, 0, 637 PyBUF_CONTIG); 638 639 /* Despite the documentation saying this field is a "const char *", 640 in Python 3.4 at least, it's really a "char *". */ 641 buf->format = (char *) "c"; 642 643 return ret; 644 } 645 646 #else 647 648 static Py_ssize_t 649 get_read_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr) 650 { 651 membuf_object *membuf_obj = (membuf_object *) self; 652 653 if (segment) 654 { 655 PyErr_SetString (PyExc_SystemError, 656 _("The memory buffer supports only one segment.")); 657 return -1; 658 } 659 660 *ptrptr = membuf_obj->buffer; 661 662 return membuf_obj->length; 663 } 664 665 static Py_ssize_t 666 get_write_buffer (PyObject *self, Py_ssize_t segment, void **ptrptr) 667 { 668 return get_read_buffer (self, segment, ptrptr); 669 } 670 671 static Py_ssize_t 672 get_seg_count (PyObject *self, Py_ssize_t *lenp) 673 { 674 if (lenp) 675 *lenp = ((membuf_object *) self)->length; 676 677 return 1; 678 } 679 680 static Py_ssize_t 681 get_char_buffer (PyObject *self, Py_ssize_t segment, char **ptrptr) 682 { 683 void *ptr = NULL; 684 Py_ssize_t ret; 685 686 ret = get_read_buffer (self, segment, &ptr); 687 *ptrptr = (char *) ptr; 688 689 return ret; 690 } 691 692 #endif /* IS_PY3K */ 693 694 /* Implementation of 695 gdb.search_memory (address, length, pattern). ADDRESS is the 696 address to start the search. LENGTH specifies the scope of the 697 search from ADDRESS. PATTERN is the pattern to search for (and 698 must be a Python object supporting the buffer protocol). 699 Returns a Python Long object holding the address where the pattern 700 was located, or if the pattern was not found, returns None. Returns NULL 701 on error, with a python exception set. */ 702 static PyObject * 703 infpy_search_memory (PyObject *self, PyObject *args, PyObject *kw) 704 { 705 struct gdb_exception except = exception_none; 706 CORE_ADDR start_addr, length; 707 static const char *keywords[] = { "address", "length", "pattern", NULL }; 708 PyObject *start_addr_obj, *length_obj; 709 Py_ssize_t pattern_size; 710 const gdb_byte *buffer; 711 CORE_ADDR found_addr; 712 int found = 0; 713 #ifdef IS_PY3K 714 Py_buffer pybuf; 715 716 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "OOs*", keywords, 717 &start_addr_obj, &length_obj, 718 &pybuf)) 719 return NULL; 720 721 buffer = (const gdb_byte *) pybuf.buf; 722 pattern_size = pybuf.len; 723 #else 724 PyObject *pattern; 725 const void *vbuffer; 726 727 if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "OOO", keywords, 728 &start_addr_obj, &length_obj, 729 &pattern)) 730 return NULL; 731 732 if (!PyObject_CheckReadBuffer (pattern)) 733 { 734 PyErr_SetString (PyExc_RuntimeError, 735 _("The pattern is not a Python buffer.")); 736 737 return NULL; 738 } 739 740 if (PyObject_AsReadBuffer (pattern, &vbuffer, &pattern_size) == -1) 741 return NULL; 742 743 buffer = (const gdb_byte *) vbuffer; 744 #endif 745 746 if (get_addr_from_python (start_addr_obj, &start_addr) < 0) 747 goto fail; 748 749 if (get_addr_from_python (length_obj, &length) < 0) 750 goto fail; 751 752 if (!length) 753 { 754 PyErr_SetString (PyExc_ValueError, 755 _("Search range is empty.")); 756 goto fail; 757 } 758 /* Watch for overflows. */ 759 else if (length > CORE_ADDR_MAX 760 || (start_addr + length - 1) < start_addr) 761 { 762 PyErr_SetString (PyExc_ValueError, 763 _("The search range is too large.")); 764 goto fail; 765 } 766 767 TRY 768 { 769 found = target_search_memory (start_addr, length, 770 buffer, pattern_size, 771 &found_addr); 772 } 773 CATCH (ex, RETURN_MASK_ALL) 774 { 775 except = ex; 776 } 777 END_CATCH 778 779 #ifdef IS_PY3K 780 PyBuffer_Release (&pybuf); 781 #endif 782 GDB_PY_HANDLE_EXCEPTION (except); 783 784 if (found) 785 return PyLong_FromLong (found_addr); 786 else 787 Py_RETURN_NONE; 788 789 fail: 790 #ifdef IS_PY3K 791 PyBuffer_Release (&pybuf); 792 #endif 793 return NULL; 794 } 795 796 /* Implementation of gdb.Inferior.is_valid (self) -> Boolean. 797 Returns True if this inferior object still exists in GDB. */ 798 799 static PyObject * 800 infpy_is_valid (PyObject *self, PyObject *args) 801 { 802 inferior_object *inf = (inferior_object *) self; 803 804 if (! inf->inferior) 805 Py_RETURN_FALSE; 806 807 Py_RETURN_TRUE; 808 } 809 810 /* Implementation of gdb.Inferior.thread_from_thread_handle (self, handle) 811 -> gdb.InferiorThread. */ 812 813 static PyObject * 814 infpy_thread_from_thread_handle (PyObject *self, PyObject *args, PyObject *kw) 815 { 816 PyObject *handle_obj; 817 inferior_object *inf_obj = (inferior_object *) self; 818 static const char *keywords[] = { "thread_handle", NULL }; 819 820 INFPY_REQUIRE_VALID (inf_obj); 821 822 if (! gdb_PyArg_ParseTupleAndKeywords (args, kw, "O", keywords, &handle_obj)) 823 return NULL; 824 825 if (!gdbpy_is_value_object (handle_obj)) 826 { 827 PyErr_SetString (PyExc_TypeError, 828 _("Argument 'handle_obj' must be a thread handle object.")); 829 830 return NULL; 831 } 832 833 TRY 834 { 835 struct thread_info *thread_info; 836 struct value *val = value_object_to_value (handle_obj); 837 838 thread_info = find_thread_by_handle (val, inf_obj->inferior); 839 if (thread_info != NULL) 840 return thread_to_thread_object (thread_info).release (); 841 } 842 CATCH (except, RETURN_MASK_ALL) 843 { 844 GDB_PY_HANDLE_EXCEPTION (except); 845 } 846 END_CATCH 847 848 Py_RETURN_NONE; 849 } 850 851 /* Implementation of gdb.Inferior.architecture. */ 852 853 static PyObject * 854 infpy_architecture (PyObject *self, PyObject *args) 855 { 856 inferior_object *inf = (inferior_object *) self; 857 858 INFPY_REQUIRE_VALID (inf); 859 860 return gdbarch_to_arch_object (inf->inferior->gdbarch); 861 } 862 863 /* Implement repr() for gdb.Inferior. */ 864 865 static PyObject * 866 infpy_repr (PyObject *obj) 867 { 868 inferior_object *self = (inferior_object *) obj; 869 inferior *inf = self->inferior; 870 871 if (inf == nullptr) 872 return PyString_FromString ("<gdb.Inferior (invalid)>"); 873 874 return PyString_FromFormat ("<gdb.Inferior num=%d, pid=%d>", 875 inf->num, inf->pid); 876 } 877 878 879 static void 880 infpy_dealloc (PyObject *obj) 881 { 882 inferior_object *inf_obj = (inferior_object *) obj; 883 struct inferior *inf = inf_obj->inferior; 884 885 if (! inf) 886 return; 887 888 set_inferior_data (inf, infpy_inf_data_key, NULL); 889 } 890 891 /* Clear the INFERIOR pointer in an Inferior object and clear the 892 thread list. */ 893 static void 894 py_free_inferior (struct inferior *inf, void *datum) 895 { 896 gdbpy_ref<inferior_object> inf_obj ((inferior_object *) datum); 897 struct threadlist_entry *th_entry, *th_tmp; 898 899 if (!gdb_python_initialized) 900 return; 901 902 gdbpy_enter enter_py (python_gdbarch, python_language); 903 904 inf_obj->inferior = NULL; 905 906 /* Deallocate threads list. */ 907 for (th_entry = inf_obj->threads; th_entry != NULL;) 908 { 909 Py_DECREF (th_entry->thread_obj); 910 911 th_tmp = th_entry; 912 th_entry = th_entry->next; 913 xfree (th_tmp); 914 } 915 916 inf_obj->nthreads = 0; 917 } 918 919 /* Implementation of gdb.selected_inferior() -> gdb.Inferior. 920 Returns the current inferior object. */ 921 922 PyObject * 923 gdbpy_selected_inferior (PyObject *self, PyObject *args) 924 { 925 return ((PyObject *) 926 inferior_to_inferior_object (current_inferior ()).release ()); 927 } 928 929 int 930 gdbpy_initialize_inferior (void) 931 { 932 if (PyType_Ready (&inferior_object_type) < 0) 933 return -1; 934 935 if (gdb_pymodule_addobject (gdb_module, "Inferior", 936 (PyObject *) &inferior_object_type) < 0) 937 return -1; 938 939 infpy_inf_data_key = 940 register_inferior_data_with_cleanup (NULL, py_free_inferior); 941 942 gdb::observers::new_thread.attach (add_thread_object); 943 gdb::observers::thread_exit.attach (delete_thread_object); 944 gdb::observers::normal_stop.attach (python_on_normal_stop); 945 gdb::observers::target_resumed.attach (python_on_resume); 946 gdb::observers::inferior_call_pre.attach (python_on_inferior_call_pre); 947 gdb::observers::inferior_call_post.attach (python_on_inferior_call_post); 948 gdb::observers::memory_changed.attach (python_on_memory_change); 949 gdb::observers::register_changed.attach (python_on_register_change); 950 gdb::observers::inferior_exit.attach (python_inferior_exit); 951 gdb::observers::new_objfile.attach (python_new_objfile); 952 gdb::observers::inferior_added.attach (python_new_inferior); 953 gdb::observers::inferior_removed.attach (python_inferior_deleted); 954 955 membuf_object_type.tp_new = PyType_GenericNew; 956 if (PyType_Ready (&membuf_object_type) < 0) 957 return -1; 958 959 return gdb_pymodule_addobject (gdb_module, "Membuf", 960 (PyObject *) &membuf_object_type); 961 } 962 963 static gdb_PyGetSetDef inferior_object_getset[] = 964 { 965 { "num", infpy_get_num, NULL, "ID of inferior, as assigned by GDB.", NULL }, 966 { "pid", infpy_get_pid, NULL, "PID of inferior, as assigned by the OS.", 967 NULL }, 968 { "was_attached", infpy_get_was_attached, NULL, 969 "True if the inferior was created using 'attach'.", NULL }, 970 { "progspace", infpy_get_progspace, NULL, "Program space of this inferior" }, 971 { NULL } 972 }; 973 974 static PyMethodDef inferior_object_methods[] = 975 { 976 { "is_valid", infpy_is_valid, METH_NOARGS, 977 "is_valid () -> Boolean.\n\ 978 Return true if this inferior is valid, false if not." }, 979 { "threads", infpy_threads, METH_NOARGS, 980 "Return all the threads of this inferior." }, 981 { "read_memory", (PyCFunction) infpy_read_memory, 982 METH_VARARGS | METH_KEYWORDS, 983 "read_memory (address, length) -> buffer\n\ 984 Return a buffer object for reading from the inferior's memory." }, 985 { "write_memory", (PyCFunction) infpy_write_memory, 986 METH_VARARGS | METH_KEYWORDS, 987 "write_memory (address, buffer [, length])\n\ 988 Write the given buffer object to the inferior's memory." }, 989 { "search_memory", (PyCFunction) infpy_search_memory, 990 METH_VARARGS | METH_KEYWORDS, 991 "search_memory (address, length, pattern) -> long\n\ 992 Return a long with the address of a match, or None." }, 993 { "thread_from_thread_handle", (PyCFunction) infpy_thread_from_thread_handle, 994 METH_VARARGS | METH_KEYWORDS, 995 "thread_from_thread_handle (handle) -> gdb.InferiorThread.\n\ 996 Return thread object corresponding to thread handle." }, 997 { "architecture", (PyCFunction) infpy_architecture, METH_NOARGS, 998 "architecture () -> gdb.Architecture\n\ 999 Return architecture of this inferior." }, 1000 { NULL } 1001 }; 1002 1003 PyTypeObject inferior_object_type = 1004 { 1005 PyVarObject_HEAD_INIT (NULL, 0) 1006 "gdb.Inferior", /* tp_name */ 1007 sizeof (inferior_object), /* tp_basicsize */ 1008 0, /* tp_itemsize */ 1009 infpy_dealloc, /* tp_dealloc */ 1010 0, /* tp_print */ 1011 0, /* tp_getattr */ 1012 0, /* tp_setattr */ 1013 0, /* tp_compare */ 1014 infpy_repr, /* tp_repr */ 1015 0, /* tp_as_number */ 1016 0, /* tp_as_sequence */ 1017 0, /* tp_as_mapping */ 1018 0, /* tp_hash */ 1019 0, /* tp_call */ 1020 0, /* tp_str */ 1021 0, /* tp_getattro */ 1022 0, /* tp_setattro */ 1023 0, /* tp_as_buffer */ 1024 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_ITER, /* tp_flags */ 1025 "GDB inferior object", /* tp_doc */ 1026 0, /* tp_traverse */ 1027 0, /* tp_clear */ 1028 0, /* tp_richcompare */ 1029 0, /* tp_weaklistoffset */ 1030 0, /* tp_iter */ 1031 0, /* tp_iternext */ 1032 inferior_object_methods, /* tp_methods */ 1033 0, /* tp_members */ 1034 inferior_object_getset, /* tp_getset */ 1035 0, /* tp_base */ 1036 0, /* tp_dict */ 1037 0, /* tp_descr_get */ 1038 0, /* tp_descr_set */ 1039 0, /* tp_dictoffset */ 1040 0, /* tp_init */ 1041 0 /* tp_alloc */ 1042 }; 1043 1044 #ifdef IS_PY3K 1045 1046 static PyBufferProcs buffer_procs = 1047 { 1048 get_buffer 1049 }; 1050 1051 #else 1052 1053 /* Python doesn't provide a decent way to get compatibility here. */ 1054 #if HAVE_LIBPYTHON2_4 1055 #define CHARBUFFERPROC_NAME getcharbufferproc 1056 #else 1057 #define CHARBUFFERPROC_NAME charbufferproc 1058 #endif 1059 1060 static PyBufferProcs buffer_procs = { 1061 get_read_buffer, 1062 get_write_buffer, 1063 get_seg_count, 1064 /* The cast here works around a difference between Python 2.4 and 1065 Python 2.5. */ 1066 (CHARBUFFERPROC_NAME) get_char_buffer 1067 }; 1068 #endif /* IS_PY3K */ 1069 1070 PyTypeObject membuf_object_type = { 1071 PyVarObject_HEAD_INIT (NULL, 0) 1072 "gdb.Membuf", /*tp_name*/ 1073 sizeof (membuf_object), /*tp_basicsize*/ 1074 0, /*tp_itemsize*/ 1075 mbpy_dealloc, /*tp_dealloc*/ 1076 0, /*tp_print*/ 1077 0, /*tp_getattr*/ 1078 0, /*tp_setattr*/ 1079 0, /*tp_compare*/ 1080 0, /*tp_repr*/ 1081 0, /*tp_as_number*/ 1082 0, /*tp_as_sequence*/ 1083 0, /*tp_as_mapping*/ 1084 0, /*tp_hash */ 1085 0, /*tp_call*/ 1086 mbpy_str, /*tp_str*/ 1087 0, /*tp_getattro*/ 1088 0, /*tp_setattro*/ 1089 &buffer_procs, /*tp_as_buffer*/ 1090 Py_TPFLAGS_DEFAULT, /*tp_flags*/ 1091 "GDB memory buffer object", /*tp_doc*/ 1092 0, /* tp_traverse */ 1093 0, /* tp_clear */ 1094 0, /* tp_richcompare */ 1095 0, /* tp_weaklistoffset */ 1096 0, /* tp_iter */ 1097 0, /* tp_iternext */ 1098 0, /* tp_methods */ 1099 0, /* tp_members */ 1100 0, /* tp_getset */ 1101 0, /* tp_base */ 1102 0, /* tp_dict */ 1103 0, /* tp_descr_get */ 1104 0, /* tp_descr_set */ 1105 0, /* tp_dictoffset */ 1106 0, /* tp_init */ 1107 0, /* tp_alloc */ 1108 }; 1109