1 /* Python frame unwinder interface.
3 Copyright (C) 2015-2018 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
21 #include "arch-utils.h"
22 #include "frame-unwind.h"
23 #include "gdb_obstack.h"
26 #include "observable.h"
27 #include "python-internal.h"
30 #include "user-regs.h"
33 #define TRACE_PY_UNWIND(level, args...) if (pyuw_debug >= level) \
34 { fprintf_unfiltered (gdb_stdlog, args); }
40 /* Frame we are unwinding. */
41 struct frame_info
*frame_info
;
43 /* Its architecture, passed by the sniffer caller. */
44 struct gdbarch
*gdbarch
;
45 } pending_frame_object
;
47 /* Saved registers array item. */
51 saved_reg (int n
, gdbpy_ref
<> &&v
)
61 /* The data we keep for the PyUnwindInfo: pending_frame, saved registers
68 /* gdb.PendingFrame for the frame we are unwinding. */
69 PyObject
*pending_frame
;
72 struct frame_id frame_id
;
74 /* Saved registers array. */
75 std::vector
<saved_reg
> *saved_regs
;
78 /* The data we keep for a frame we can unwind: frame ID and an array of
79 (register_number, register_value) pairs. */
84 struct frame_id frame_id
;
86 /* GDB Architecture. */
87 struct gdbarch
*gdbarch
;
89 /* Length of the `reg' array below. */
95 extern PyTypeObject pending_frame_object_type
96 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("pending_frame_object");
98 extern PyTypeObject unwind_info_object_type
99 CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF ("unwind_info_object");
101 static unsigned int pyuw_debug
= 0;
103 static struct gdbarch_data
*pyuw_gdbarch_data
;
105 /* Parses register id, which can be either a number or a name.
106 Returns 1 on success, 0 otherwise. */
109 pyuw_parse_register_id (struct gdbarch
*gdbarch
, PyObject
*pyo_reg_id
,
112 if (pyo_reg_id
== NULL
)
114 if (gdbpy_is_string (pyo_reg_id
))
116 gdb::unique_xmalloc_ptr
<char> reg_name (gdbpy_obj_to_string (pyo_reg_id
));
118 if (reg_name
== NULL
)
120 *reg_num
= user_reg_map_name_to_regnum (gdbarch
, reg_name
.get (),
121 strlen (reg_name
.get ()));
122 return *reg_num
>= 0;
124 else if (PyInt_Check (pyo_reg_id
))
127 if (gdb_py_int_as_long (pyo_reg_id
, &value
) && (int) value
== value
)
129 *reg_num
= (int) value
;
130 return user_reg_map_regnum_to_name (gdbarch
, *reg_num
) != NULL
;
136 /* Convert gdb.Value instance to inferior's pointer. Return 1 on success,
140 pyuw_value_obj_to_pointer (PyObject
*pyo_value
, CORE_ADDR
*addr
)
147 if ((value
= value_object_to_value (pyo_value
)) != NULL
)
149 *addr
= unpack_pointer (value_type (value
),
150 value_contents (value
));
154 CATCH (except
, RETURN_MASK_ALL
)
156 gdbpy_convert_exception (except
);
162 /* Get attribute from an object and convert it to the inferior's
163 pointer value. Return 1 if attribute exists and its value can be
164 converted. Otherwise, if attribute does not exist or its value is
165 None, return 0. In all other cases set Python error and return
169 pyuw_object_attribute_to_pointer (PyObject
*pyo
, const char *attr_name
,
174 if (PyObject_HasAttrString (pyo
, attr_name
))
176 gdbpy_ref
<> pyo_value (PyObject_GetAttrString (pyo
, attr_name
));
178 if (pyo_value
!= NULL
&& pyo_value
!= Py_None
)
180 rc
= pyuw_value_obj_to_pointer (pyo_value
.get (), addr
);
184 _("The value of the '%s' attribute is not a pointer."),
191 /* Called by the Python interpreter to obtain string representation
192 of the UnwindInfo object. */
195 unwind_infopy_str (PyObject
*self
)
197 unwind_info_object
*unwind_info
= (unwind_info_object
*) self
;
200 stb
.puts ("Frame ID: ");
201 fprint_frame_id (&stb
, unwind_info
->frame_id
);
203 const char *sep
= "";
204 struct value_print_options opts
;
206 get_user_print_options (&opts
);
207 stb
.printf ("\nSaved registers: (");
208 for (const saved_reg
®
: *unwind_info
->saved_regs
)
210 struct value
*value
= value_object_to_value (reg
.value
.get ());
212 stb
.printf ("%s(%d, ", sep
, reg
.number
);
217 value_print (value
, &stb
, &opts
);
220 CATCH (except
, RETURN_MASK_ALL
)
222 GDB_PY_HANDLE_EXCEPTION (except
);
233 return PyString_FromString (stb
.c_str ());
236 /* Create UnwindInfo instance for given PendingFrame and frame ID.
237 Sets Python error and returns NULL on error. */
240 pyuw_create_unwind_info (PyObject
*pyo_pending_frame
,
241 struct frame_id frame_id
)
243 unwind_info_object
*unwind_info
244 = PyObject_New (unwind_info_object
, &unwind_info_object_type
);
246 if (((pending_frame_object
*) pyo_pending_frame
)->frame_info
== NULL
)
248 PyErr_SetString (PyExc_ValueError
,
249 "Attempting to use stale PendingFrame");
252 unwind_info
->frame_id
= frame_id
;
253 Py_INCREF (pyo_pending_frame
);
254 unwind_info
->pending_frame
= pyo_pending_frame
;
255 unwind_info
->saved_regs
= new std::vector
<saved_reg
>;
256 return (PyObject
*) unwind_info
;
259 /* The implementation of
260 gdb.UnwindInfo.add_saved_register (REG, VALUE) -> None. */
263 unwind_infopy_add_saved_register (PyObject
*self
, PyObject
*args
)
265 unwind_info_object
*unwind_info
= (unwind_info_object
*) self
;
266 pending_frame_object
*pending_frame
267 = (pending_frame_object
*) (unwind_info
->pending_frame
);
268 PyObject
*pyo_reg_id
;
269 PyObject
*pyo_reg_value
;
272 if (pending_frame
->frame_info
== NULL
)
274 PyErr_SetString (PyExc_ValueError
,
275 "UnwindInfo instance refers to a stale PendingFrame");
278 if (!PyArg_UnpackTuple (args
, "previous_frame_register", 2, 2,
279 &pyo_reg_id
, &pyo_reg_value
))
281 if (!pyuw_parse_register_id (pending_frame
->gdbarch
, pyo_reg_id
, ®num
))
283 PyErr_SetString (PyExc_ValueError
, "Bad register");
290 if (pyo_reg_value
== NULL
291 || (value
= value_object_to_value (pyo_reg_value
)) == NULL
)
293 PyErr_SetString (PyExc_ValueError
, "Bad register value");
296 data_size
= register_size (pending_frame
->gdbarch
, regnum
);
297 if (data_size
!= TYPE_LENGTH (value_type (value
)))
301 "The value of the register returned by the Python "
302 "sniffer has unexpected size: %u instead of %u.",
303 (unsigned) TYPE_LENGTH (value_type (value
)),
304 (unsigned) data_size
);
309 gdbpy_ref
<> new_value
= gdbpy_ref
<>::new_reference (pyo_reg_value
);
311 for (saved_reg
®
: *unwind_info
->saved_regs
)
313 if (regnum
== reg
.number
)
316 reg
.value
= std::move (new_value
);
321 unwind_info
->saved_regs
->emplace_back (regnum
, std::move (new_value
));
326 /* UnwindInfo cleanup. */
329 unwind_infopy_dealloc (PyObject
*self
)
331 unwind_info_object
*unwind_info
= (unwind_info_object
*) self
;
335 Py_XDECREF (unwind_info
->pending_frame
);
336 delete unwind_info
->saved_regs
;
337 Py_TYPE (self
)->tp_free (self
);
340 /* Called by the Python interpreter to obtain string representation
341 of the PendingFrame object. */
344 pending_framepy_str (PyObject
*self
)
346 struct frame_info
*frame
= ((pending_frame_object
*) self
)->frame_info
;
347 const char *sp_str
= NULL
;
348 const char *pc_str
= NULL
;
351 return PyString_FromString ("Stale PendingFrame instance");
354 sp_str
= core_addr_to_string_nz (get_frame_sp (frame
));
355 pc_str
= core_addr_to_string_nz (get_frame_pc (frame
));
357 CATCH (except
, RETURN_MASK_ALL
)
359 GDB_PY_HANDLE_EXCEPTION (except
);
363 return PyString_FromFormat ("SP=%s,PC=%s", sp_str
, pc_str
);
366 /* Implementation of gdb.PendingFrame.read_register (self, reg) -> gdb.Value.
367 Returns the value of register REG as gdb.Value instance. */
370 pending_framepy_read_register (PyObject
*self
, PyObject
*args
)
372 pending_frame_object
*pending_frame
= (pending_frame_object
*) self
;
373 struct value
*val
= NULL
;
375 PyObject
*pyo_reg_id
;
377 if (pending_frame
->frame_info
== NULL
)
379 PyErr_SetString (PyExc_ValueError
,
380 "Attempting to read register from stale PendingFrame");
383 if (!PyArg_UnpackTuple (args
, "read_register", 1, 1, &pyo_reg_id
))
385 if (!pyuw_parse_register_id (pending_frame
->gdbarch
, pyo_reg_id
, ®num
))
387 PyErr_SetString (PyExc_ValueError
, "Bad register");
393 /* Fetch the value associated with a register, whether it's
394 a real register or a so called "user" register, like "pc",
395 which maps to a real register. In the past,
396 get_frame_register_value() was used here, which did not
397 handle the user register case. */
398 val
= value_of_register (regnum
, pending_frame
->frame_info
);
400 PyErr_Format (PyExc_ValueError
,
401 "Cannot read register %d from frame.",
404 CATCH (except
, RETURN_MASK_ALL
)
406 GDB_PY_HANDLE_EXCEPTION (except
);
410 return val
== NULL
? NULL
: value_to_value_object (val
);
414 PendingFrame.create_unwind_info (self, frameId) -> UnwindInfo. */
417 pending_framepy_create_unwind_info (PyObject
*self
, PyObject
*args
)
419 PyObject
*pyo_frame_id
;
424 if (!PyArg_ParseTuple (args
, "O:create_unwind_info", &pyo_frame_id
))
426 if (!pyuw_object_attribute_to_pointer (pyo_frame_id
, "sp", &sp
))
428 PyErr_SetString (PyExc_ValueError
,
429 _("frame_id should have 'sp' attribute."));
433 /* The logic of building frame_id depending on the attributes of
435 Has Has Has Function to call
436 'sp'? 'pc'? 'special'?
437 ------|------|--------------|-------------------------
438 Y N * frame_id_build_wild (sp)
439 Y Y N frame_id_build (sp, pc)
440 Y Y Y frame_id_build_special (sp, pc, special)
442 if (!pyuw_object_attribute_to_pointer (pyo_frame_id
, "pc", &pc
))
443 return pyuw_create_unwind_info (self
, frame_id_build_wild (sp
));
444 if (!pyuw_object_attribute_to_pointer (pyo_frame_id
, "special", &special
))
445 return pyuw_create_unwind_info (self
, frame_id_build (sp
, pc
));
447 return pyuw_create_unwind_info (self
,
448 frame_id_build_special (sp
, pc
, special
));
451 /* frame_unwind.this_id method. */
454 pyuw_this_id (struct frame_info
*this_frame
, void **cache_ptr
,
455 struct frame_id
*this_id
)
457 *this_id
= ((cached_frame_info
*) *cache_ptr
)->frame_id
;
460 fprintf_unfiltered (gdb_stdlog
, "%s: frame_id: ", __FUNCTION__
);
461 fprint_frame_id (gdb_stdlog
, *this_id
);
462 fprintf_unfiltered (gdb_stdlog
, "\n");
466 /* frame_unwind.prev_register. */
468 static struct value
*
469 pyuw_prev_register (struct frame_info
*this_frame
, void **cache_ptr
,
472 cached_frame_info
*cached_frame
= (cached_frame_info
*) *cache_ptr
;
473 cached_reg_t
*reg_info
= cached_frame
->reg
;
474 cached_reg_t
*reg_info_end
= reg_info
+ cached_frame
->reg_count
;
476 TRACE_PY_UNWIND (1, "%s (frame=%p,...,reg=%d)\n", __FUNCTION__
, this_frame
,
478 for (; reg_info
< reg_info_end
; ++reg_info
)
480 if (regnum
== reg_info
->num
)
481 return frame_unwind_got_bytes (this_frame
, regnum
, reg_info
->data
);
484 return frame_unwind_got_optimized (this_frame
, regnum
);
487 /* Frame sniffer dispatch. */
490 pyuw_sniffer (const struct frame_unwind
*self
, struct frame_info
*this_frame
,
493 struct gdbarch
*gdbarch
= (struct gdbarch
*) (self
->unwind_data
);
494 cached_frame_info
*cached_frame
;
496 gdbpy_enter
enter_py (gdbarch
, current_language
);
498 TRACE_PY_UNWIND (3, "%s (SP=%s, PC=%s)\n", __FUNCTION__
,
499 paddress (gdbarch
, get_frame_sp (this_frame
)),
500 paddress (gdbarch
, get_frame_pc (this_frame
)));
502 /* Create PendingFrame instance to pass to sniffers. */
503 pending_frame_object
*pfo
= PyObject_New (pending_frame_object
,
504 &pending_frame_object_type
);
505 gdbpy_ref
<> pyo_pending_frame ((PyObject
*) pfo
);
506 if (pyo_pending_frame
== NULL
)
508 gdbpy_print_stack ();
511 pfo
->gdbarch
= gdbarch
;
512 scoped_restore invalidate_frame
= make_scoped_restore (&pfo
->frame_info
,
516 if (gdb_python_module
== NULL
517 || ! PyObject_HasAttrString (gdb_python_module
, "execute_unwinders"))
519 PyErr_SetString (PyExc_NameError
,
520 "Installation error: gdb.execute_unwinders function "
522 gdbpy_print_stack ();
525 gdbpy_ref
<> pyo_execute (PyObject_GetAttrString (gdb_python_module
,
526 "execute_unwinders"));
527 if (pyo_execute
== NULL
)
529 gdbpy_print_stack ();
533 gdbpy_ref
<> pyo_unwind_info
534 (PyObject_CallFunctionObjArgs (pyo_execute
.get (),
535 pyo_pending_frame
.get (), NULL
));
536 if (pyo_unwind_info
== NULL
)
538 /* If the unwinder is cancelled due to a Ctrl-C, then propagate
539 the Ctrl-C as a GDB exception instead of swallowing it. */
540 if (PyErr_ExceptionMatches (PyExc_KeyboardInterrupt
))
545 gdbpy_print_stack ();
548 if (pyo_unwind_info
== Py_None
)
551 /* Received UnwindInfo, cache data. */
552 if (PyObject_IsInstance (pyo_unwind_info
.get (),
553 (PyObject
*) &unwind_info_object_type
) <= 0)
554 error (_("A Unwinder should return gdb.UnwindInfo instance."));
557 unwind_info_object
*unwind_info
=
558 (unwind_info_object
*) pyo_unwind_info
.get ();
559 int reg_count
= unwind_info
->saved_regs
->size ();
562 = ((cached_frame_info
*)
563 xmalloc (sizeof (*cached_frame
)
564 + reg_count
* sizeof (cached_frame
->reg
[0])));
565 cached_frame
->gdbarch
= gdbarch
;
566 cached_frame
->frame_id
= unwind_info
->frame_id
;
567 cached_frame
->reg_count
= reg_count
;
569 /* Populate registers array. */
570 for (int i
= 0; i
< unwind_info
->saved_regs
->size (); ++i
)
572 saved_reg
*reg
= &(*unwind_info
->saved_regs
)[i
];
574 struct value
*value
= value_object_to_value (reg
->value
.get ());
575 size_t data_size
= register_size (gdbarch
, reg
->number
);
577 cached_frame
->reg
[i
].num
= reg
->number
;
579 /* `value' validation was done before, just assert. */
580 gdb_assert (value
!= NULL
);
581 gdb_assert (data_size
== TYPE_LENGTH (value_type (value
)));
583 cached_frame
->reg
[i
].data
= (gdb_byte
*) xmalloc (data_size
);
584 memcpy (cached_frame
->reg
[i
].data
, value_contents (value
), data_size
);
588 *cache_ptr
= cached_frame
;
592 /* Frame cache release shim. */
595 pyuw_dealloc_cache (struct frame_info
*this_frame
, void *cache
)
597 TRACE_PY_UNWIND (3, "%s: enter", __FUNCTION__
);
598 cached_frame_info
*cached_frame
= (cached_frame_info
*) cache
;
600 for (int i
= 0; i
< cached_frame
->reg_count
; i
++)
601 xfree (cached_frame
->reg
[i
].data
);
606 struct pyuw_gdbarch_data_type
608 /* Has the unwinder shim been prepended? */
609 int unwinder_registered
;
613 pyuw_gdbarch_data_init (struct gdbarch
*gdbarch
)
615 return GDBARCH_OBSTACK_ZALLOC (gdbarch
, struct pyuw_gdbarch_data_type
);
618 /* New inferior architecture callback: register the Python unwinders
622 pyuw_on_new_gdbarch (struct gdbarch
*newarch
)
624 struct pyuw_gdbarch_data_type
*data
625 = (struct pyuw_gdbarch_data_type
*) gdbarch_data (newarch
,
628 if (!data
->unwinder_registered
)
630 struct frame_unwind
*unwinder
631 = GDBARCH_OBSTACK_ZALLOC (newarch
, struct frame_unwind
);
633 unwinder
->type
= NORMAL_FRAME
;
634 unwinder
->stop_reason
= default_frame_unwind_stop_reason
;
635 unwinder
->this_id
= pyuw_this_id
;
636 unwinder
->prev_register
= pyuw_prev_register
;
637 unwinder
->unwind_data
= (const struct frame_data
*) newarch
;
638 unwinder
->sniffer
= pyuw_sniffer
;
639 unwinder
->dealloc_cache
= pyuw_dealloc_cache
;
640 frame_unwind_prepend_unwinder (newarch
, unwinder
);
641 data
->unwinder_registered
= 1;
645 /* Initialize unwind machinery. */
648 gdbpy_initialize_unwind (void)
651 add_setshow_zuinteger_cmd
652 ("py-unwind", class_maintenance
, &pyuw_debug
,
653 _("Set Python unwinder debugging."),
654 _("Show Python unwinder debugging."),
655 _("When non-zero, Python unwinder debugging is enabled."),
658 &setdebuglist
, &showdebuglist
);
660 = gdbarch_data_register_post_init (pyuw_gdbarch_data_init
);
661 gdb::observers::architecture_changed
.attach (pyuw_on_new_gdbarch
);
663 if (PyType_Ready (&pending_frame_object_type
) < 0)
665 rc
= gdb_pymodule_addobject (gdb_module
, "PendingFrame",
666 (PyObject
*) &pending_frame_object_type
);
670 if (PyType_Ready (&unwind_info_object_type
) < 0)
672 return gdb_pymodule_addobject (gdb_module
, "UnwindInfo",
673 (PyObject
*) &unwind_info_object_type
);
676 static PyMethodDef pending_frame_object_methods
[] =
678 { "read_register", pending_framepy_read_register
, METH_VARARGS
,
679 "read_register (REG) -> gdb.Value\n"
680 "Return the value of the REG in the frame." },
681 { "create_unwind_info",
682 pending_framepy_create_unwind_info
, METH_VARARGS
,
683 "create_unwind_info (FRAME_ID) -> gdb.UnwindInfo\n"
684 "Construct UnwindInfo for this PendingFrame, using FRAME_ID\n"
686 {NULL
} /* Sentinel */
689 PyTypeObject pending_frame_object_type
=
691 PyVarObject_HEAD_INIT (NULL
, 0)
692 "gdb.PendingFrame", /* tp_name */
693 sizeof (pending_frame_object
), /* tp_basicsize */
701 0, /* tp_as_number */
702 0, /* tp_as_sequence */
703 0, /* tp_as_mapping */
706 pending_framepy_str
, /* tp_str */
709 0, /* tp_as_buffer */
710 Py_TPFLAGS_DEFAULT
, /* tp_flags */
711 "GDB PendingFrame object", /* tp_doc */
714 0, /* tp_richcompare */
715 0, /* tp_weaklistoffset */
718 pending_frame_object_methods
, /* tp_methods */
723 0, /* tp_descr_get */
724 0, /* tp_descr_set */
725 0, /* tp_dictoffset */
730 static PyMethodDef unwind_info_object_methods
[] =
732 { "add_saved_register",
733 unwind_infopy_add_saved_register
, METH_VARARGS
,
734 "add_saved_register (REG, VALUE) -> None\n"
735 "Set the value of the REG in the previous frame to VALUE." },
736 { NULL
} /* Sentinel */
739 PyTypeObject unwind_info_object_type
=
741 PyVarObject_HEAD_INIT (NULL
, 0)
742 "gdb.UnwindInfo", /* tp_name */
743 sizeof (unwind_info_object
), /* tp_basicsize */
745 unwind_infopy_dealloc
, /* tp_dealloc */
751 0, /* tp_as_number */
752 0, /* tp_as_sequence */
753 0, /* tp_as_mapping */
756 unwind_infopy_str
, /* tp_str */
759 0, /* tp_as_buffer */
760 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_BASETYPE
, /* tp_flags */
761 "GDB UnwindInfo object", /* tp_doc */
764 0, /* tp_richcompare */
765 0, /* tp_weaklistoffset */
768 unwind_info_object_methods
, /* tp_methods */
773 0, /* tp_descr_get */
774 0, /* tp_descr_set */
775 0, /* tp_dictoffset */