1 /* Python interface to stack frames
3 Copyright (C) 2008-2023 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"
33 struct frame_id frame_id
;
34 struct gdbarch
*gdbarch
;
36 /* Marks that the FRAME_ID member actually holds the ID of the frame next
37 to this, and not this frames' ID itself. This is a hack to permit Python
38 frame objects which represent invalid frames (i.e., the last frame_info
39 in a corrupt stack). The problem arises from the fact that this code
40 relies on FRAME_ID to uniquely identify a frame, which is not always true
41 for the last "frame" in a corrupt stack (it can have a null ID, or the same
42 ID as the previous frame). Whenever get_prev_frame returns NULL, we
43 record the frame_id of the next frame and set FRAME_ID_IS_NEXT to 1. */
47 /* Require a valid frame. This must be called inside a TRY_CATCH, or
48 another context in which a gdb exception is allowed. */
49 #define FRAPY_REQUIRE_VALID(frame_obj, frame) \
51 frame = frame_object_to_frame_info (frame_obj); \
53 error (_("Frame is invalid.")); \
56 /* Returns the frame_info object corresponding to the given Python Frame
57 object. If the frame doesn't exist anymore (the frame id doesn't
58 correspond to any frame in the inferior), returns NULL. */
61 frame_object_to_frame_info (PyObject
*obj
)
63 frame_object
*frame_obj
= (frame_object
*) obj
;
66 frame
= frame_find_by_id (frame_obj
->frame_id
);
70 if (frame_obj
->frame_id_is_next
)
71 frame
= get_prev_frame (frame
);
76 /* Called by the Python interpreter to obtain string representation
80 frapy_str (PyObject
*self
)
82 const frame_id
&fid
= ((frame_object
*) self
)->frame_id
;
83 return PyUnicode_FromString (fid
.to_string ().c_str ());
86 /* Implementation of gdb.Frame.is_valid (self) -> Boolean.
87 Returns True if the frame corresponding to the frame_id of this
88 object still exists in the inferior. */
91 frapy_is_valid (PyObject
*self
, PyObject
*args
)
93 frame_info_ptr frame
= NULL
;
97 frame
= frame_object_to_frame_info (self
);
99 catch (const gdb_exception
&except
)
101 GDB_PY_HANDLE_EXCEPTION (except
);
110 /* Implementation of gdb.Frame.name (self) -> String.
111 Returns the name of the function corresponding to this frame. */
114 frapy_name (PyObject
*self
, PyObject
*args
)
116 frame_info_ptr frame
;
117 gdb::unique_xmalloc_ptr
<char> name
;
123 FRAPY_REQUIRE_VALID (self
, frame
);
125 name
= find_frame_funname (frame
, &lang
, NULL
);
127 catch (const gdb_exception
&except
)
129 GDB_PY_HANDLE_EXCEPTION (except
);
134 result
= PyUnicode_Decode (name
.get (), strlen (name
.get ()),
135 host_charset (), NULL
);
146 /* Implementation of gdb.Frame.type (self) -> Integer.
147 Returns the frame type, namely one of the gdb.*_FRAME constants. */
150 frapy_type (PyObject
*self
, PyObject
*args
)
152 frame_info_ptr frame
;
153 enum frame_type type
= NORMAL_FRAME
;/* Initialize to appease gcc warning. */
157 FRAPY_REQUIRE_VALID (self
, frame
);
159 type
= get_frame_type (frame
);
161 catch (const gdb_exception
&except
)
163 GDB_PY_HANDLE_EXCEPTION (except
);
166 return gdb_py_object_from_longest (type
).release ();
169 /* Implementation of gdb.Frame.architecture (self) -> gdb.Architecture.
170 Returns the frame's architecture as a gdb.Architecture object. */
173 frapy_arch (PyObject
*self
, PyObject
*args
)
175 frame_info_ptr frame
= NULL
; /* Initialize to appease gcc warning. */
176 frame_object
*obj
= (frame_object
*) self
;
180 FRAPY_REQUIRE_VALID (self
, frame
);
182 catch (const gdb_exception
&except
)
184 GDB_PY_HANDLE_EXCEPTION (except
);
187 return gdbarch_to_arch_object (obj
->gdbarch
);
190 /* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer.
191 Returns one of the gdb.FRAME_UNWIND_* constants. */
194 frapy_unwind_stop_reason (PyObject
*self
, PyObject
*args
)
196 frame_info_ptr frame
= NULL
; /* Initialize to appease gcc warning. */
197 enum unwind_stop_reason stop_reason
;
201 FRAPY_REQUIRE_VALID (self
, frame
);
203 catch (const gdb_exception
&except
)
205 GDB_PY_HANDLE_EXCEPTION (except
);
208 stop_reason
= get_frame_unwind_stop_reason (frame
);
210 return gdb_py_object_from_longest (stop_reason
).release ();
213 /* Implementation of gdb.Frame.pc (self) -> Long.
214 Returns the frame's resume address. */
217 frapy_pc (PyObject
*self
, PyObject
*args
)
219 CORE_ADDR pc
= 0; /* Initialize to appease gcc warning. */
220 frame_info_ptr frame
;
224 FRAPY_REQUIRE_VALID (self
, frame
);
226 pc
= get_frame_pc (frame
);
228 catch (const gdb_exception
&except
)
230 GDB_PY_HANDLE_EXCEPTION (except
);
233 return gdb_py_object_from_ulongest (pc
).release ();
236 /* Implementation of gdb.Frame.read_register (self, register) -> gdb.Value.
237 Returns the value of a register in this frame. */
240 frapy_read_register (PyObject
*self
, PyObject
*args
)
242 PyObject
*pyo_reg_id
;
243 struct value
*val
= NULL
;
245 if (!PyArg_UnpackTuple (args
, "read_register", 1, 1, &pyo_reg_id
))
249 frame_info_ptr frame
;
252 FRAPY_REQUIRE_VALID (self
, frame
);
254 if (!gdbpy_parse_register_id (get_frame_arch (frame
), pyo_reg_id
,
258 gdb_assert (regnum
>= 0);
259 val
= value_of_register (regnum
, frame
);
262 PyErr_SetString (PyExc_ValueError
, _("Can't read register."));
264 catch (const gdb_exception
&except
)
266 GDB_PY_HANDLE_EXCEPTION (except
);
269 return val
== NULL
? NULL
: value_to_value_object (val
);
272 /* Implementation of gdb.Frame.block (self) -> gdb.Block.
273 Returns the frame's code block. */
276 frapy_block (PyObject
*self
, PyObject
*args
)
278 frame_info_ptr frame
;
279 const struct block
*block
= NULL
, *fn_block
;
283 FRAPY_REQUIRE_VALID (self
, frame
);
284 block
= get_frame_block (frame
, NULL
);
286 catch (const gdb_exception
&except
)
288 GDB_PY_HANDLE_EXCEPTION (except
);
291 for (fn_block
= block
;
292 fn_block
!= NULL
&& fn_block
->function () == NULL
;
293 fn_block
= fn_block
->superblock ())
296 if (block
== NULL
|| fn_block
== NULL
|| fn_block
->function () == NULL
)
298 PyErr_SetString (PyExc_RuntimeError
,
299 _("Cannot locate block for frame."));
305 return block_to_block_object
306 (block
, fn_block
->function ()->objfile ());
313 /* Implementation of gdb.Frame.function (self) -> gdb.Symbol.
314 Returns the symbol for the function corresponding to this frame. */
317 frapy_function (PyObject
*self
, PyObject
*args
)
319 struct symbol
*sym
= NULL
;
320 frame_info_ptr frame
;
324 enum language funlang
;
326 FRAPY_REQUIRE_VALID (self
, frame
);
328 gdb::unique_xmalloc_ptr
<char> funname
329 = find_frame_funname (frame
, &funlang
, &sym
);
331 catch (const gdb_exception
&except
)
333 GDB_PY_HANDLE_EXCEPTION (except
);
337 return symbol_to_symbol_object (sym
);
342 /* Convert a frame_info struct to a Python Frame object.
343 Sets a Python exception and returns NULL on error. */
346 frame_info_to_frame_object (frame_info_ptr frame
)
348 gdbpy_ref
<frame_object
> frame_obj (PyObject_New (frame_object
,
349 &frame_object_type
));
350 if (frame_obj
== NULL
)
356 /* Try to get the previous frame, to determine if this is the last frame
357 in a corrupt stack. If so, we need to store the frame_id of the next
358 frame and not of this one (which is possibly invalid). */
359 if (get_prev_frame (frame
) == NULL
360 && get_frame_unwind_stop_reason (frame
) != UNWIND_NO_REASON
361 && get_next_frame (frame
) != NULL
)
363 frame_obj
->frame_id
= get_frame_id (get_next_frame (frame
));
364 frame_obj
->frame_id_is_next
= 1;
368 frame_obj
->frame_id
= get_frame_id (frame
);
369 frame_obj
->frame_id_is_next
= 0;
371 frame_obj
->gdbarch
= get_frame_arch (frame
);
373 catch (const gdb_exception
&except
)
375 gdbpy_convert_exception (except
);
379 return (PyObject
*) frame_obj
.release ();
382 /* Implementation of gdb.Frame.older (self) -> gdb.Frame.
383 Returns the frame immediately older (outer) to this frame, or None if
387 frapy_older (PyObject
*self
, PyObject
*args
)
389 frame_info_ptr frame
, prev
= NULL
;
390 PyObject
*prev_obj
= NULL
; /* Initialize to appease gcc warning. */
394 FRAPY_REQUIRE_VALID (self
, frame
);
396 prev
= get_prev_frame (frame
);
398 catch (const gdb_exception
&except
)
400 GDB_PY_HANDLE_EXCEPTION (except
);
404 prev_obj
= frame_info_to_frame_object (prev
);
414 /* Implementation of gdb.Frame.newer (self) -> gdb.Frame.
415 Returns the frame immediately newer (inner) to this frame, or None if
419 frapy_newer (PyObject
*self
, PyObject
*args
)
421 frame_info_ptr frame
, next
= NULL
;
422 PyObject
*next_obj
= NULL
; /* Initialize to appease gcc warning. */
426 FRAPY_REQUIRE_VALID (self
, frame
);
428 next
= get_next_frame (frame
);
430 catch (const gdb_exception
&except
)
432 GDB_PY_HANDLE_EXCEPTION (except
);
436 next_obj
= frame_info_to_frame_object (next
);
446 /* Implementation of gdb.Frame.find_sal (self) -> gdb.Symtab_and_line.
447 Returns the frame's symtab and line. */
450 frapy_find_sal (PyObject
*self
, PyObject
*args
)
452 frame_info_ptr frame
;
453 PyObject
*sal_obj
= NULL
; /* Initialize to appease gcc warning. */
457 FRAPY_REQUIRE_VALID (self
, frame
);
459 symtab_and_line sal
= find_frame_sal (frame
);
460 sal_obj
= symtab_and_line_to_sal_object (sal
);
462 catch (const gdb_exception
&except
)
464 GDB_PY_HANDLE_EXCEPTION (except
);
470 /* Implementation of gdb.Frame.read_var_value (self, variable,
471 [block]) -> gdb.Value. If the optional block argument is provided
472 start the search from that block, otherwise search from the frame's
473 current block (determined by examining the resume address of the
474 frame). The variable argument must be a string or an instance of a
475 gdb.Symbol. The block argument must be an instance of gdb.Block. Returns
476 NULL on error, with a python exception set. */
478 frapy_read_var (PyObject
*self
, PyObject
*args
)
480 frame_info_ptr frame
;
481 PyObject
*sym_obj
, *block_obj
= NULL
;
482 struct symbol
*var
= NULL
; /* gcc-4.3.2 false warning. */
483 const struct block
*block
= NULL
;
484 struct value
*val
= NULL
;
486 if (!PyArg_ParseTuple (args
, "O|O", &sym_obj
, &block_obj
))
489 if (PyObject_TypeCheck (sym_obj
, &symbol_object_type
))
490 var
= symbol_object_to_symbol (sym_obj
);
491 else if (gdbpy_is_string (sym_obj
))
493 gdb::unique_xmalloc_ptr
<char>
494 var_name (python_string_to_target_string (sym_obj
));
501 block
= block_object_to_block (block_obj
);
504 PyErr_SetString (PyExc_RuntimeError
,
505 _("Second argument must be block."));
512 struct block_symbol lookup_sym
;
513 FRAPY_REQUIRE_VALID (self
, frame
);
516 block
= get_frame_block (frame
, NULL
);
517 lookup_sym
= lookup_symbol (var_name
.get (), block
, VAR_DOMAIN
, NULL
);
518 var
= lookup_sym
.symbol
;
519 block
= lookup_sym
.block
;
521 catch (const gdb_exception
&except
)
523 gdbpy_convert_exception (except
);
529 PyErr_Format (PyExc_ValueError
,
530 _("Variable '%s' not found."), var_name
.get ());
537 PyErr_SetString (PyExc_TypeError
,
538 _("Argument must be a symbol or string."));
544 FRAPY_REQUIRE_VALID (self
, frame
);
546 val
= read_var_value (var
, block
, frame
);
548 catch (const gdb_exception
&except
)
550 GDB_PY_HANDLE_EXCEPTION (except
);
553 return value_to_value_object (val
);
556 /* Select this frame. */
559 frapy_select (PyObject
*self
, PyObject
*args
)
565 FRAPY_REQUIRE_VALID (self
, fi
);
569 catch (const gdb_exception
&except
)
571 GDB_PY_HANDLE_EXCEPTION (except
);
577 /* The stack frame level for this frame. */
580 frapy_level (PyObject
*self
, PyObject
*args
)
586 FRAPY_REQUIRE_VALID (self
, fi
);
588 return gdb_py_object_from_longest (frame_relative_level (fi
)).release ();
590 catch (const gdb_exception
&except
)
592 GDB_PY_HANDLE_EXCEPTION (except
);
598 /* The language for this frame. */
601 frapy_language (PyObject
*self
, PyObject
*args
)
606 FRAPY_REQUIRE_VALID (self
, fi
);
608 enum language lang
= get_frame_language (fi
);
609 const language_defn
*lang_def
= language_def (lang
);
611 return host_string_to_python_string (lang_def
->name ()).release ();
613 catch (const gdb_exception
&except
)
615 GDB_PY_HANDLE_EXCEPTION (except
);
621 /* Implementation of gdb.newest_frame () -> gdb.Frame.
622 Returns the newest frame object. */
625 gdbpy_newest_frame (PyObject
*self
, PyObject
*args
)
627 frame_info_ptr frame
= NULL
;
631 frame
= get_current_frame ();
633 catch (const gdb_exception
&except
)
635 GDB_PY_HANDLE_EXCEPTION (except
);
638 return frame_info_to_frame_object (frame
);
641 /* Implementation of gdb.selected_frame () -> gdb.Frame.
642 Returns the selected frame object. */
645 gdbpy_selected_frame (PyObject
*self
, PyObject
*args
)
647 frame_info_ptr frame
= NULL
;
651 frame
= get_selected_frame ("No frame is currently selected.");
653 catch (const gdb_exception
&except
)
655 GDB_PY_HANDLE_EXCEPTION (except
);
658 return frame_info_to_frame_object (frame
);
661 /* Implementation of gdb.stop_reason_string (Integer) -> String.
662 Return a string explaining the unwind stop reason. */
665 gdbpy_frame_stop_reason_string (PyObject
*self
, PyObject
*args
)
670 if (!PyArg_ParseTuple (args
, "i", &reason
))
673 if (reason
< UNWIND_FIRST
|| reason
> UNWIND_LAST
)
675 PyErr_SetString (PyExc_ValueError
,
676 _("Invalid frame stop reason."));
680 str
= unwind_stop_reason_to_string ((enum unwind_stop_reason
) reason
);
681 return PyUnicode_Decode (str
, strlen (str
), host_charset (), NULL
);
684 /* Implements the equality comparison for Frame objects.
685 All other comparison operators will throw a TypeError Python exception,
686 as they aren't valid for frames. */
689 frapy_richcompare (PyObject
*self
, PyObject
*other
, int op
)
693 if (!PyObject_TypeCheck (other
, &frame_object_type
)
694 || (op
!= Py_EQ
&& op
!= Py_NE
))
696 Py_INCREF (Py_NotImplemented
);
697 return Py_NotImplemented
;
700 frame_object
*self_frame
= (frame_object
*) self
;
701 frame_object
*other_frame
= (frame_object
*) other
;
703 if (self_frame
->frame_id_is_next
== other_frame
->frame_id_is_next
704 && self_frame
->frame_id
== other_frame
->frame_id
)
714 /* Sets up the Frame API in the gdb module. */
717 gdbpy_initialize_frames (void)
719 frame_object_type
.tp_new
= PyType_GenericNew
;
720 if (PyType_Ready (&frame_object_type
) < 0)
723 /* Note: These would probably be best exposed as class attributes of
724 Frame, but I don't know how to do it except by messing with the
725 type's dictionary. That seems too messy. */
726 if (PyModule_AddIntConstant (gdb_module
, "NORMAL_FRAME", NORMAL_FRAME
) < 0
727 || PyModule_AddIntConstant (gdb_module
, "DUMMY_FRAME", DUMMY_FRAME
) < 0
728 || PyModule_AddIntConstant (gdb_module
, "INLINE_FRAME", INLINE_FRAME
) < 0
729 || PyModule_AddIntConstant (gdb_module
, "TAILCALL_FRAME",
731 || PyModule_AddIntConstant (gdb_module
, "SIGTRAMP_FRAME",
733 || PyModule_AddIntConstant (gdb_module
, "ARCH_FRAME", ARCH_FRAME
) < 0
734 || PyModule_AddIntConstant (gdb_module
, "SENTINEL_FRAME",
738 #define SET(name, description) \
739 if (PyModule_AddIntConstant (gdb_module, "FRAME_"#name, name) < 0) \
741 #include "unwind_stop_reasons.def"
744 return gdb_pymodule_addobject (gdb_module
, "Frame",
745 (PyObject
*) &frame_object_type
);
750 static PyMethodDef frame_object_methods
[] = {
751 { "is_valid", frapy_is_valid
, METH_NOARGS
,
752 "is_valid () -> Boolean.\n\
753 Return true if this frame is valid, false if not." },
754 { "name", frapy_name
, METH_NOARGS
,
755 "name () -> String.\n\
756 Return the function name of the frame, or None if it can't be determined." },
757 { "type", frapy_type
, METH_NOARGS
,
758 "type () -> Integer.\n\
759 Return the type of the frame." },
760 { "architecture", frapy_arch
, METH_NOARGS
,
761 "architecture () -> gdb.Architecture.\n\
762 Return the architecture of the frame." },
763 { "unwind_stop_reason", frapy_unwind_stop_reason
, METH_NOARGS
,
764 "unwind_stop_reason () -> Integer.\n\
765 Return the reason why it's not possible to find frames older than this." },
766 { "pc", frapy_pc
, METH_NOARGS
,
768 Return the frame's resume address." },
769 { "read_register", frapy_read_register
, METH_VARARGS
,
770 "read_register (register_name) -> gdb.Value\n\
771 Return the value of the register in the frame." },
772 { "block", frapy_block
, METH_NOARGS
,
773 "block () -> gdb.Block.\n\
774 Return the frame's code block." },
775 { "function", frapy_function
, METH_NOARGS
,
776 "function () -> gdb.Symbol.\n\
777 Returns the symbol for the function corresponding to this frame." },
778 { "older", frapy_older
, METH_NOARGS
,
779 "older () -> gdb.Frame.\n\
780 Return the frame that called this frame." },
781 { "newer", frapy_newer
, METH_NOARGS
,
782 "newer () -> gdb.Frame.\n\
783 Return the frame called by this frame." },
784 { "find_sal", frapy_find_sal
, METH_NOARGS
,
785 "find_sal () -> gdb.Symtab_and_line.\n\
786 Return the frame's symtab and line." },
787 { "read_var", frapy_read_var
, METH_VARARGS
,
788 "read_var (variable) -> gdb.Value.\n\
789 Return the value of the variable in this frame." },
790 { "select", frapy_select
, METH_NOARGS
,
791 "Select this frame as the user's current frame." },
792 { "level", frapy_level
, METH_NOARGS
,
793 "The stack level of this frame." },
794 { "language", frapy_language
, METH_NOARGS
,
795 "The language of this frame." },
796 {NULL
} /* Sentinel */
799 PyTypeObject frame_object_type
= {
800 PyVarObject_HEAD_INIT (NULL
, 0)
801 "gdb.Frame", /* tp_name */
802 sizeof (frame_object
), /* tp_basicsize */
810 0, /* tp_as_number */
811 0, /* tp_as_sequence */
812 0, /* tp_as_mapping */
815 frapy_str
, /* tp_str */
818 0, /* tp_as_buffer */
819 Py_TPFLAGS_DEFAULT
, /* tp_flags */
820 "GDB frame object", /* tp_doc */
823 frapy_richcompare
, /* tp_richcompare */
824 0, /* tp_weaklistoffset */
827 frame_object_methods
, /* tp_methods */
832 0, /* tp_descr_get */
833 0, /* tp_descr_set */
834 0, /* tp_dictoffset */