33 #define TRACE_PY_UNWIND(level, args...) if (pyuw_debug >= level) \ 34 { fprintf_unfiltered (gdb_stdlog, args); } 107 if (pyo_reg_id == NULL)
113 if (reg_name == NULL)
116 strlen (reg_name.get ()));
117 return *reg_num >= 0;
119 else if (PyInt_Check (pyo_reg_id))
124 *reg_num = (int)
value;
173 if (pyo_value != NULL && pyo_value != Py_None)
179 _(
"The value of the '%s' attribute is not a pointer."),
195 stb.
puts (
"Frame ID: ");
198 const char *sep =
"";
204 stb.
printf (
"\nSaved registers: (");
209 stb.
printf (
"%s(%d, ", sep,
reg->number);
230 return PyString_FromString (stb.
c_str ());
245 PyErr_SetString (PyExc_ValueError,
246 "Attempting to use stale PendingFrame");
250 Py_INCREF (pyo_pending_frame);
253 return (PyObject *) unwind_info;
265 PyObject *pyo_reg_id;
266 PyObject *pyo_reg_value;
271 PyErr_SetString (PyExc_ValueError,
272 "UnwindInfo instance refers to a stale PendingFrame");
275 if (!PyArg_UnpackTuple (args,
"previous_frame_register", 2, 2,
276 &pyo_reg_id, &pyo_reg_value))
280 PyErr_SetString (PyExc_ValueError,
"Bad register");
287 if (pyo_reg_value == NULL
290 PyErr_SetString (PyExc_ValueError,
"Bad register value");
298 "The value of the register returned by the Python " 299 "sniffer has unexpected size: %u instead of %u.",
301 (
unsigned) data_size);
322 Py_INCREF (pyo_reg_value);
323 reg->value = pyo_reg_value;
341 Py_TYPE (
self)->tp_free (
self);
351 const char *sp_str = NULL;
352 const char *pc_str = NULL;
355 return PyString_FromString (
"Stale PendingFrame instance");
367 return PyString_FromFormat (
"SP=%s,PC=%s", sp_str, pc_str);
377 struct value *val = NULL;
379 PyObject *pyo_reg_id;
383 PyErr_SetString (PyExc_ValueError,
384 "Attempting to read register from stale PendingFrame");
387 if (!PyArg_UnpackTuple (args,
"read_register", 1, 1, &pyo_reg_id))
391 PyErr_SetString (PyExc_ValueError,
"Bad register");
404 PyErr_Format (PyExc_ValueError,
405 "Cannot read register %d from frame.",
423 PyObject *pyo_frame_id;
428 if (!PyArg_ParseTuple (args,
"O:create_unwind_info", &pyo_frame_id))
432 PyErr_SetString (PyExc_ValueError,
433 _(
"frame_id should have 'sp' attribute."));
472 static struct value *
480 TRACE_PY_UNWIND (1,
"%s (frame=%p,...,reg=%d)\n", __FUNCTION__, this_frame,
482 for (; reg_info < reg_info_end; ++reg_info)
510 if (pyo_pending_frame == NULL)
523 PyErr_SetString (PyExc_NameError,
524 "Installation error: gdb.execute_unwinders function " 530 "execute_unwinders"));
531 if (pyo_execute == NULL)
538 (PyObject_CallFunctionObjArgs (pyo_execute.
get (),
539 pyo_pending_frame.
get (), NULL));
540 if (pyo_unwind_info == NULL)
544 if (PyErr_ExceptionMatches (PyExc_KeyboardInterrupt))
552 if (pyo_unwind_info == Py_None)
556 if (PyObject_IsInstance (pyo_unwind_info.
get (),
558 error (
_(
"A Unwinder should return gdb.UnwindInfo instance."));
569 xmalloc (
sizeof (*cached_frame)
570 + reg_count *
sizeof (cached_frame->
reg[0])));
593 *cache_ptr = cached_frame;
605 for (
int i = 0; i < cached_frame->
reg_count; i++)
658 _(
"Set Python unwinder debugging."),
659 _(
"Show Python unwinder debugging."),
660 _(
"When non-zero, Python unwinder debugging is enabled."),
684 "read_register (REG) -> gdb.Value\n" 685 "Return the value of the REG in the frame." },
686 {
"create_unwind_info",
688 "create_unwind_info (FRAME_ID) -> gdb.UnwindInfo\n" 689 "Construct UnwindInfo for this PendingFrame, using FRAME_ID\n" 716 "GDB PendingFrame object",
737 {
"add_saved_register",
739 "add_saved_register (REG, VALUE) -> None\n" 740 "Set the value of the REG in the previous frame to VALUE." },
765 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
766 "GDB UnwindInfo object",
int gdb_pymodule_addobject(PyObject *module, const char *name, PyObject *object)
static struct gdbarch_data * pyuw_gdbarch_data
const char * user_reg_map_regnum_to_name(struct gdbarch *gdbarch, int regnum)
#define PyObject_GetAttrString(obj, attr)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
struct value * frame_unwind_got_bytes(struct frame_info *frame, int regnum, gdb_byte *buf)
PyObject * gdb_python_module
gdb::unique_xmalloc_ptr< char > gdbpy_obj_to_string(PyObject *obj)
CORE_ADDR get_frame_pc(struct frame_info *frame)
void value_print(struct value *val, struct ui_file *stream, const struct value_print_options *options)
int gdbpy_initialize_unwind(void)
CORE_ADDR unpack_pointer(struct type *type, const gdb_byte *valaddr)
int gdbpy_is_string(PyObject *obj)
static void pyuw_on_new_gdbarch(struct gdbarch *newarch)
static void * pyuw_gdbarch_data_init(struct gdbarch *gdbarch)
CORE_ADDR get_frame_sp(struct frame_info *this_frame)
frame_prev_register_ftype * prev_register
frame_sniffer_ftype * sniffer
frame_dealloc_cache_ftype * dealloc_cache
#define VEC_safe_push(T, V, O)
#define PyVarObject_HEAD_INIT(type, size)
static unsigned int pyuw_debug
void frame_unwind_prepend_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
static void pyuw_dealloc_cache(struct frame_info *this_frame, void *cache)
PyObject_HEAD struct frame_info * frame_info
#define GDBARCH_OBSTACK_ZALLOC(GDBARCH, TYPE)
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
static PyObject * pyuw_create_unwind_info(PyObject *pyo_pending_frame, struct frame_id frame_id)
#define GDB_PY_HANDLE_EXCEPTION(Exception)
scoped_restore_tmpl< T > make_scoped_restore(T *var)
void add_setshow_zuinteger_cmd(const char *name, enum command_class theclass, unsigned int *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
#define VEC_iterate(T, V, I, P)
const gdb_byte * value_contents(struct value *value)
#define CATCH(EXCEPTION, MASK)
std::unique_ptr< T, xfree_deleter< T > > unique_xmalloc_ptr
struct observer * observer_attach_architecture_changed(observer_architecture_changed_ftype *f)
struct value::@186::@187 reg
static PyObject * pending_framepy_create_unwind_info(PyObject *self, PyObject *args)
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
static void unwind_infopy_dealloc(PyObject *self)
frame_unwind_stop_reason_ftype * stop_reason
struct frame_id frame_id_build_special(CORE_ADDR stack_addr, CORE_ADDR code_addr, CORE_ADDR special_addr)
PyTypeObject unwind_info_object_type
static PyObject * unwind_infopy_str(PyObject *self)
static PyMethodDef pending_frame_object_methods[]
#define TRACE_PY_UNWIND(level, args...)
PyTypeObject pending_frame_object_type CPYCHECKER_TYPE_OBJECT_FOR_TYPEDEF("pending_frame_object")
PyObject * value_to_value_object(struct value *val)
struct cmd_list_element * setdebuglist
virtual void puts(const char *str)
int user_reg_map_name_to_regnum(struct gdbarch *gdbarch, const char *name, int len)
struct value * frame_unwind_got_optimized(struct frame_info *frame, int regnum)
void printf(const char *,...) ATTRIBUTE_PRINTF(2
static struct value * pyuw_prev_register(struct frame_info *this_frame, void **cache_ptr, int regnum)
static int pyuw_object_attribute_to_pointer(PyObject *pyo, const char *attr_name, CORE_ADDR *addr)
static PyObject * pending_framepy_str(PyObject *self)
const struct language_defn * current_language
PyTypeObject pending_frame_object_type
static PyMethodDef unwind_info_object_methods[]
static int pyuw_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **cache_ptr)
void gdbpy_convert_exception(struct gdb_exception exception)
struct value * value_of_register(int regnum, struct frame_info *frame)
static PyObject * pending_framepy_read_register(PyObject *self, PyObject *args)
const char * c_str() const
static void pyuw_this_id(struct frame_info *this_frame, void **cache_ptr, struct frame_id *this_id)
static PyObject * unwind_infopy_add_saved_register(PyObject *self, PyObject *args)
void gdbpy_print_stack(void)
void get_user_print_options(struct value_print_options *opts)
void fprint_frame_id(struct ui_file *file, struct frame_id id)
PyObject_HEAD PyObject * pending_frame
enum unwind_stop_reason default_frame_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
int gdb_py_int_as_long(PyObject *obj, long *result)
int register_size(struct gdbarch *gdbarch, int regnum)
struct type * value_type(const struct value *value)
frame_this_id_ftype * this_id
struct cmd_list_element * showdebuglist
struct frame_id frame_id_build_wild(CORE_ADDR stack_addr)
struct value * value_object_to_value(PyObject *self)
const struct frame_data * unwind_data
#define TYPE_LENGTH(thistype)
static int pyuw_parse_register_id(struct gdbarch *gdbarch, PyObject *pyo_reg_id, int *reg_num)
const char * core_addr_to_string_nz(const CORE_ADDR addr)
void error(const char *fmt,...)
struct gdbarch_data * gdbarch_data_register_post_init(gdbarch_data_post_init_ftype *post_init)
#define PyObject_HasAttrString(obj, attr)
static int pyuw_value_obj_to_pointer(PyObject *pyo_value, CORE_ADDR *addr)