1 /* Python interface to stack frames
3 Copyright (C) 2008-2019 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/>. */
27 #include "python-internal.h"
30 #include "user-regs.h"
35 struct frame_id frame_id
;
36 struct gdbarch
*gdbarch
;
38 /* Marks that the FRAME_ID member actually holds the ID of the frame next
39 to this, and not this frames' ID itself. This is a hack to permit Python
40 frame objects which represent invalid frames (i.e., the last frame_info
41 in a corrupt stack). The problem arises from the fact that this code
42 relies on FRAME_ID to uniquely identify a frame, which is not always true
43 for the last "frame" in a corrupt stack (it can have a null ID, or the same
44 ID as the previous frame). Whenever get_prev_frame returns NULL, we
45 record the frame_id of the next frame and set FRAME_ID_IS_NEXT to 1. */
49 /* Require a valid frame. This must be called inside a TRY_CATCH, or
50 another context in which a gdb exception is allowed. */
51 #define FRAPY_REQUIRE_VALID(frame_obj, frame) \
53 frame = frame_object_to_frame_info (frame_obj); \
55 error (_("Frame is invalid.")); \
58 /* Returns the frame_info object corresponding to the given Python Frame
59 object. If the frame doesn't exist anymore (the frame id doesn't
60 correspond to any frame in the inferior), returns NULL. */
63 frame_object_to_frame_info (PyObject
*obj
)
65 frame_object
*frame_obj
= (frame_object
*) obj
;
66 struct frame_info
*frame
;
68 frame
= frame_find_by_id (frame_obj
->frame_id
);
72 if (frame_obj
->frame_id_is_next
)
73 frame
= get_prev_frame (frame
);
78 /* Called by the Python interpreter to obtain string representation
82 frapy_str (PyObject
*self
)
86 fprint_frame_id (&strfile
, ((frame_object
*) self
)->frame_id
);
87 return PyString_FromString (strfile
.c_str ());
90 /* Implementation of gdb.Frame.is_valid (self) -> Boolean.
91 Returns True if the frame corresponding to the frame_id of this
92 object still exists in the inferior. */
95 frapy_is_valid (PyObject
*self
, PyObject
*args
)
97 struct frame_info
*frame
= NULL
;
101 frame
= frame_object_to_frame_info (self
);
103 CATCH (except
, RETURN_MASK_ALL
)
105 GDB_PY_HANDLE_EXCEPTION (except
);
115 /* Implementation of gdb.Frame.name (self) -> String.
116 Returns the name of the function corresponding to this frame. */
119 frapy_name (PyObject
*self
, PyObject
*args
)
121 struct frame_info
*frame
;
122 gdb::unique_xmalloc_ptr
<char> name
;
128 FRAPY_REQUIRE_VALID (self
, frame
);
130 name
= find_frame_funname (frame
, &lang
, NULL
);
132 CATCH (except
, RETURN_MASK_ALL
)
134 GDB_PY_HANDLE_EXCEPTION (except
);
140 result
= PyUnicode_Decode (name
.get (), strlen (name
.get ()),
141 host_charset (), NULL
);
152 /* Implementation of gdb.Frame.type (self) -> Integer.
153 Returns the frame type, namely one of the gdb.*_FRAME constants. */
156 frapy_type (PyObject
*self
, PyObject
*args
)
158 struct frame_info
*frame
;
159 enum frame_type type
= NORMAL_FRAME
;/* Initialize to appease gcc warning. */
163 FRAPY_REQUIRE_VALID (self
, frame
);
165 type
= get_frame_type (frame
);
167 CATCH (except
, RETURN_MASK_ALL
)
169 GDB_PY_HANDLE_EXCEPTION (except
);
173 return PyInt_FromLong (type
);
176 /* Implementation of gdb.Frame.architecture (self) -> gdb.Architecture.
177 Returns the frame's architecture as a gdb.Architecture object. */
180 frapy_arch (PyObject
*self
, PyObject
*args
)
182 struct frame_info
*frame
= NULL
; /* Initialize to appease gcc warning. */
183 frame_object
*obj
= (frame_object
*) self
;
187 FRAPY_REQUIRE_VALID (self
, frame
);
189 CATCH (except
, RETURN_MASK_ALL
)
191 GDB_PY_HANDLE_EXCEPTION (except
);
195 return gdbarch_to_arch_object (obj
->gdbarch
);
198 /* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer.
199 Returns one of the gdb.FRAME_UNWIND_* constants. */
202 frapy_unwind_stop_reason (PyObject
*self
, PyObject
*args
)
204 struct frame_info
*frame
= NULL
; /* Initialize to appease gcc warning. */
205 enum unwind_stop_reason stop_reason
;
209 FRAPY_REQUIRE_VALID (self
, frame
);
211 CATCH (except
, RETURN_MASK_ALL
)
213 GDB_PY_HANDLE_EXCEPTION (except
);
217 stop_reason
= get_frame_unwind_stop_reason (frame
);
219 return PyInt_FromLong (stop_reason
);
222 /* Implementation of gdb.Frame.pc (self) -> Long.
223 Returns the frame's resume address. */
226 frapy_pc (PyObject
*self
, PyObject
*args
)
228 CORE_ADDR pc
= 0; /* Initialize to appease gcc warning. */
229 struct frame_info
*frame
;
233 FRAPY_REQUIRE_VALID (self
, frame
);
235 pc
= get_frame_pc (frame
);
237 CATCH (except
, RETURN_MASK_ALL
)
239 GDB_PY_HANDLE_EXCEPTION (except
);
243 return gdb_py_long_from_ulongest (pc
);
246 /* Implementation of gdb.Frame.read_register (self, register) -> gdb.Value.
247 Returns the value of a register in this frame. */
250 frapy_read_register (PyObject
*self
, PyObject
*args
)
252 const char *regnum_str
;
253 struct value
*val
= NULL
;
255 if (!PyArg_ParseTuple (args
, "s", ®num_str
))
260 struct frame_info
*frame
;
263 FRAPY_REQUIRE_VALID (self
, frame
);
265 regnum
= user_reg_map_name_to_regnum (get_frame_arch (frame
),
267 strlen (regnum_str
));
269 val
= value_of_register (regnum
, frame
);
272 PyErr_SetString (PyExc_ValueError
, _("Unknown register."));
274 CATCH (except
, RETURN_MASK_ALL
)
276 GDB_PY_HANDLE_EXCEPTION (except
);
280 return val
== NULL
? NULL
: value_to_value_object (val
);
283 /* Implementation of gdb.Frame.block (self) -> gdb.Block.
284 Returns the frame's code block. */
287 frapy_block (PyObject
*self
, PyObject
*args
)
289 struct frame_info
*frame
;
290 const struct block
*block
= NULL
, *fn_block
;
294 FRAPY_REQUIRE_VALID (self
, frame
);
295 block
= get_frame_block (frame
, NULL
);
297 CATCH (except
, RETURN_MASK_ALL
)
299 GDB_PY_HANDLE_EXCEPTION (except
);
303 for (fn_block
= block
;
304 fn_block
!= NULL
&& BLOCK_FUNCTION (fn_block
) == NULL
;
305 fn_block
= BLOCK_SUPERBLOCK (fn_block
))
308 if (block
== NULL
|| fn_block
== NULL
|| BLOCK_FUNCTION (fn_block
) == NULL
)
310 PyErr_SetString (PyExc_RuntimeError
,
311 _("Cannot locate block for frame."));
317 return block_to_block_object
318 (block
, symbol_objfile (BLOCK_FUNCTION (fn_block
)));
325 /* Implementation of gdb.Frame.function (self) -> gdb.Symbol.
326 Returns the symbol for the function corresponding to this frame. */
329 frapy_function (PyObject
*self
, PyObject
*args
)
331 struct symbol
*sym
= NULL
;
332 struct frame_info
*frame
;
336 enum language funlang
;
338 FRAPY_REQUIRE_VALID (self
, frame
);
340 gdb::unique_xmalloc_ptr
<char> funname
341 = find_frame_funname (frame
, &funlang
, &sym
);
343 CATCH (except
, RETURN_MASK_ALL
)
345 GDB_PY_HANDLE_EXCEPTION (except
);
350 return symbol_to_symbol_object (sym
);
355 /* Convert a frame_info struct to a Python Frame object.
356 Sets a Python exception and returns NULL on error. */
359 frame_info_to_frame_object (struct frame_info
*frame
)
361 gdbpy_ref
<frame_object
> frame_obj (PyObject_New (frame_object
,
362 &frame_object_type
));
363 if (frame_obj
== NULL
)
369 /* Try to get the previous frame, to determine if this is the last frame
370 in a corrupt stack. If so, we need to store the frame_id of the next
371 frame and not of this one (which is possibly invalid). */
372 if (get_prev_frame (frame
) == NULL
373 && get_frame_unwind_stop_reason (frame
) != UNWIND_NO_REASON
374 && get_next_frame (frame
) != NULL
)
376 frame_obj
->frame_id
= get_frame_id (get_next_frame (frame
));
377 frame_obj
->frame_id_is_next
= 1;
381 frame_obj
->frame_id
= get_frame_id (frame
);
382 frame_obj
->frame_id_is_next
= 0;
384 frame_obj
->gdbarch
= get_frame_arch (frame
);
386 CATCH (except
, RETURN_MASK_ALL
)
388 gdbpy_convert_exception (except
);
393 return (PyObject
*) frame_obj
.release ();
396 /* Implementation of gdb.Frame.older (self) -> gdb.Frame.
397 Returns the frame immediately older (outer) to this frame, or None if
401 frapy_older (PyObject
*self
, PyObject
*args
)
403 struct frame_info
*frame
, *prev
= NULL
;
404 PyObject
*prev_obj
= NULL
; /* Initialize to appease gcc warning. */
408 FRAPY_REQUIRE_VALID (self
, frame
);
410 prev
= get_prev_frame (frame
);
412 CATCH (except
, RETURN_MASK_ALL
)
414 GDB_PY_HANDLE_EXCEPTION (except
);
419 prev_obj
= frame_info_to_frame_object (prev
);
429 /* Implementation of gdb.Frame.newer (self) -> gdb.Frame.
430 Returns the frame immediately newer (inner) to this frame, or None if
434 frapy_newer (PyObject
*self
, PyObject
*args
)
436 struct frame_info
*frame
, *next
= NULL
;
437 PyObject
*next_obj
= NULL
; /* Initialize to appease gcc warning. */
441 FRAPY_REQUIRE_VALID (self
, frame
);
443 next
= get_next_frame (frame
);
445 CATCH (except
, RETURN_MASK_ALL
)
447 GDB_PY_HANDLE_EXCEPTION (except
);
452 next_obj
= frame_info_to_frame_object (next
);
462 /* Implementation of gdb.Frame.find_sal (self) -> gdb.Symtab_and_line.
463 Returns the frame's symtab and line. */
466 frapy_find_sal (PyObject
*self
, PyObject
*args
)
468 struct frame_info
*frame
;
469 PyObject
*sal_obj
= NULL
; /* Initialize to appease gcc warning. */
473 FRAPY_REQUIRE_VALID (self
, frame
);
475 symtab_and_line sal
= find_frame_sal (frame
);
476 sal_obj
= symtab_and_line_to_sal_object (sal
);
478 CATCH (except
, RETURN_MASK_ALL
)
480 GDB_PY_HANDLE_EXCEPTION (except
);
487 /* Implementation of gdb.Frame.read_var_value (self, variable,
488 [block]) -> gdb.Value. If the optional block argument is provided
489 start the search from that block, otherwise search from the frame's
490 current block (determined by examining the resume address of the
491 frame). The variable argument must be a string or an instance of a
492 gdb.Symbol. The block argument must be an instance of gdb.Block. Returns
493 NULL on error, with a python exception set. */
495 frapy_read_var (PyObject
*self
, PyObject
*args
)
497 struct frame_info
*frame
;
498 PyObject
*sym_obj
, *block_obj
= NULL
;
499 struct symbol
*var
= NULL
; /* gcc-4.3.2 false warning. */
500 const struct block
*block
= NULL
;
501 struct value
*val
= NULL
;
503 if (!PyArg_ParseTuple (args
, "O|O", &sym_obj
, &block_obj
))
506 if (PyObject_TypeCheck (sym_obj
, &symbol_object_type
))
507 var
= symbol_object_to_symbol (sym_obj
);
508 else if (gdbpy_is_string (sym_obj
))
510 gdb::unique_xmalloc_ptr
<char>
511 var_name (python_string_to_target_string (sym_obj
));
518 block
= block_object_to_block (block_obj
);
521 PyErr_SetString (PyExc_RuntimeError
,
522 _("Second argument must be block."));
529 struct block_symbol lookup_sym
;
530 FRAPY_REQUIRE_VALID (self
, frame
);
533 block
= get_frame_block (frame
, NULL
);
534 lookup_sym
= lookup_symbol (var_name
.get (), block
, VAR_DOMAIN
, NULL
);
535 var
= lookup_sym
.symbol
;
536 block
= lookup_sym
.block
;
538 CATCH (except
, RETURN_MASK_ALL
)
540 gdbpy_convert_exception (except
);
547 PyErr_Format (PyExc_ValueError
,
548 _("Variable '%s' not found."), var_name
.get ());
555 PyErr_SetString (PyExc_TypeError
,
556 _("Argument must be a symbol or string."));
562 FRAPY_REQUIRE_VALID (self
, frame
);
564 val
= read_var_value (var
, block
, frame
);
566 CATCH (except
, RETURN_MASK_ALL
)
568 GDB_PY_HANDLE_EXCEPTION (except
);
572 return value_to_value_object (val
);
575 /* Select this frame. */
578 frapy_select (PyObject
*self
, PyObject
*args
)
580 struct frame_info
*fi
;
584 FRAPY_REQUIRE_VALID (self
, fi
);
588 CATCH (except
, RETURN_MASK_ALL
)
590 GDB_PY_HANDLE_EXCEPTION (except
);
597 /* Implementation of gdb.newest_frame () -> gdb.Frame.
598 Returns the newest frame object. */
601 gdbpy_newest_frame (PyObject
*self
, PyObject
*args
)
603 struct frame_info
*frame
= NULL
;
607 frame
= get_current_frame ();
609 CATCH (except
, RETURN_MASK_ALL
)
611 GDB_PY_HANDLE_EXCEPTION (except
);
615 return frame_info_to_frame_object (frame
);
618 /* Implementation of gdb.selected_frame () -> gdb.Frame.
619 Returns the selected frame object. */
622 gdbpy_selected_frame (PyObject
*self
, PyObject
*args
)
624 struct frame_info
*frame
= NULL
;
628 frame
= get_selected_frame ("No frame is currently selected.");
630 CATCH (except
, RETURN_MASK_ALL
)
632 GDB_PY_HANDLE_EXCEPTION (except
);
636 return frame_info_to_frame_object (frame
);
639 /* Implementation of gdb.stop_reason_string (Integer) -> String.
640 Return a string explaining the unwind stop reason. */
643 gdbpy_frame_stop_reason_string (PyObject
*self
, PyObject
*args
)
648 if (!PyArg_ParseTuple (args
, "i", &reason
))
651 if (reason
< UNWIND_FIRST
|| reason
> UNWIND_LAST
)
653 PyErr_SetString (PyExc_ValueError
,
654 _("Invalid frame stop reason."));
658 str
= unwind_stop_reason_to_string ((enum unwind_stop_reason
) reason
);
659 return PyUnicode_Decode (str
, strlen (str
), host_charset (), NULL
);
662 /* Implements the equality comparison for Frame objects.
663 All other comparison operators will throw a TypeError Python exception,
664 as they aren't valid for frames. */
667 frapy_richcompare (PyObject
*self
, PyObject
*other
, int op
)
671 if (!PyObject_TypeCheck (other
, &frame_object_type
)
672 || (op
!= Py_EQ
&& op
!= Py_NE
))
674 Py_INCREF (Py_NotImplemented
);
675 return Py_NotImplemented
;
678 if (frame_id_eq (((frame_object
*) self
)->frame_id
,
679 ((frame_object
*) other
)->frame_id
))
689 /* Sets up the Frame API in the gdb module. */
692 gdbpy_initialize_frames (void)
694 frame_object_type
.tp_new
= PyType_GenericNew
;
695 if (PyType_Ready (&frame_object_type
) < 0)
698 /* Note: These would probably be best exposed as class attributes of
699 Frame, but I don't know how to do it except by messing with the
700 type's dictionary. That seems too messy. */
701 if (PyModule_AddIntConstant (gdb_module
, "NORMAL_FRAME", NORMAL_FRAME
) < 0
702 || PyModule_AddIntConstant (gdb_module
, "DUMMY_FRAME", DUMMY_FRAME
) < 0
703 || PyModule_AddIntConstant (gdb_module
, "INLINE_FRAME", INLINE_FRAME
) < 0
704 || PyModule_AddIntConstant (gdb_module
, "TAILCALL_FRAME",
706 || PyModule_AddIntConstant (gdb_module
, "SIGTRAMP_FRAME",
708 || PyModule_AddIntConstant (gdb_module
, "ARCH_FRAME", ARCH_FRAME
) < 0
709 || PyModule_AddIntConstant (gdb_module
, "SENTINEL_FRAME",
713 #define SET(name, description) \
714 if (PyModule_AddIntConstant (gdb_module, "FRAME_"#name, name) < 0) \
716 #include "unwind_stop_reasons.def"
719 return gdb_pymodule_addobject (gdb_module
, "Frame",
720 (PyObject
*) &frame_object_type
);
725 static PyMethodDef frame_object_methods
[] = {
726 { "is_valid", frapy_is_valid
, METH_NOARGS
,
727 "is_valid () -> Boolean.\n\
728 Return true if this frame is valid, false if not." },
729 { "name", frapy_name
, METH_NOARGS
,
730 "name () -> String.\n\
731 Return the function name of the frame, or None if it can't be determined." },
732 { "type", frapy_type
, METH_NOARGS
,
733 "type () -> Integer.\n\
734 Return the type of the frame." },
735 { "architecture", frapy_arch
, METH_NOARGS
,
736 "architecture () -> gdb.Architecture.\n\
737 Return the architecture of the frame." },
738 { "unwind_stop_reason", frapy_unwind_stop_reason
, METH_NOARGS
,
739 "unwind_stop_reason () -> Integer.\n\
740 Return the reason why it's not possible to find frames older than this." },
741 { "pc", frapy_pc
, METH_NOARGS
,
743 Return the frame's resume address." },
744 { "read_register", frapy_read_register
, METH_VARARGS
,
745 "read_register (register_name) -> gdb.Value\n\
746 Return the value of the register in the frame." },
747 { "block", frapy_block
, METH_NOARGS
,
748 "block () -> gdb.Block.\n\
749 Return the frame's code block." },
750 { "function", frapy_function
, METH_NOARGS
,
751 "function () -> gdb.Symbol.\n\
752 Returns the symbol for the function corresponding to this frame." },
753 { "older", frapy_older
, METH_NOARGS
,
754 "older () -> gdb.Frame.\n\
755 Return the frame that called this frame." },
756 { "newer", frapy_newer
, METH_NOARGS
,
757 "newer () -> gdb.Frame.\n\
758 Return the frame called by this frame." },
759 { "find_sal", frapy_find_sal
, METH_NOARGS
,
760 "find_sal () -> gdb.Symtab_and_line.\n\
761 Return the frame's symtab and line." },
762 { "read_var", frapy_read_var
, METH_VARARGS
,
763 "read_var (variable) -> gdb.Value.\n\
764 Return the value of the variable in this frame." },
765 { "select", frapy_select
, METH_NOARGS
,
766 "Select this frame as the user's current frame." },
767 {NULL
} /* Sentinel */
770 PyTypeObject frame_object_type
= {
771 PyVarObject_HEAD_INIT (NULL
, 0)
772 "gdb.Frame", /* tp_name */
773 sizeof (frame_object
), /* tp_basicsize */
781 0, /* tp_as_number */
782 0, /* tp_as_sequence */
783 0, /* tp_as_mapping */
786 frapy_str
, /* tp_str */
789 0, /* tp_as_buffer */
790 Py_TPFLAGS_DEFAULT
, /* tp_flags */
791 "GDB frame object", /* tp_doc */
794 frapy_richcompare
, /* tp_richcompare */
795 0, /* tp_weaklistoffset */
798 frame_object_methods
, /* tp_methods */
803 0, /* tp_descr_get */
804 0, /* tp_descr_set */
805 0, /* tp_dictoffset */