1 /* Python interface to stack frames
3 Copyright (C) 2008, 2009, 2010 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/>. */
24 #include "exceptions.h"
28 #include "python-internal.h"
34 struct frame_id frame_id
;
35 struct gdbarch
*gdbarch
;
37 /* Marks that the FRAME_ID member actually holds the ID of the frame next
38 to this, and not this frames' ID itself. This is a hack to permit Python
39 frame objects which represent invalid frames (i.e., the last frame_info
40 in a corrupt stack). The problem arises from the fact that this code
41 relies on FRAME_ID to uniquely identify a frame, which is not always true
42 for the last "frame" in a corrupt stack (it can have a null ID, or the same
43 ID as the previous frame). Whenever get_prev_frame returns NULL, we
44 record the frame_id of the next frame and set FRAME_ID_IS_NEXT to 1. */
48 /* Require a valid frame. This must be called inside a TRY_CATCH, or
49 another context in which a gdb exception is allowed. */
50 #define FRAPY_REQUIRE_VALID(frame_obj, frame) \
52 frame = frame_object_to_frame_info (frame_obj); \
54 error ("Frame is invalid."); \
57 static PyTypeObject frame_object_type
;
59 /* Returns the frame_info object corresponding to the given Python Frame
60 object. If the frame doesn't exist anymore (the frame id doesn't
61 correspond to any frame in the inferior), returns NULL. */
63 static struct frame_info
*
64 frame_object_to_frame_info (frame_object
*frame_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 struct ui_file
*strfile
;
88 strfile
= mem_fileopen ();
89 fprint_frame_id (strfile
, ((frame_object
*) self
)->frame_id
);
90 s
= ui_file_xstrdup (strfile
, NULL
);
91 result
= PyString_FromString (s
);
97 /* Implementation of gdb.Frame.is_valid (self) -> Boolean.
98 Returns True if the frame corresponding to the frame_id of this
99 object still exists in the inferior. */
102 frapy_is_valid (PyObject
*self
, PyObject
*args
)
104 struct frame_info
*frame
;
106 frame
= frame_object_to_frame_info ((frame_object
*) self
);
113 /* Implementation of gdb.Frame.name (self) -> String.
114 Returns the name of the function corresponding to this frame. */
117 frapy_name (PyObject
*self
, PyObject
*args
)
119 struct frame_info
*frame
;
123 volatile struct gdb_exception except
;
125 TRY_CATCH (except
, RETURN_MASK_ALL
)
127 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
129 find_frame_funname (frame
, &name
, &lang
);
131 GDB_PY_HANDLE_EXCEPTION (except
);
134 result
= PyUnicode_Decode (name
, strlen (name
), host_charset (), NULL
);
144 /* Implementation of gdb.Frame.type (self) -> Integer.
145 Returns the frame type, namely one of the gdb.*_FRAME constants. */
148 frapy_type (PyObject
*self
, PyObject
*args
)
150 struct frame_info
*frame
;
151 enum frame_type type
= NORMAL_FRAME
;/* Initialize to appease gcc warning. */
152 volatile struct gdb_exception except
;
154 TRY_CATCH (except
, RETURN_MASK_ALL
)
156 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
158 type
= get_frame_type (frame
);
160 GDB_PY_HANDLE_EXCEPTION (except
);
162 return PyInt_FromLong (type
);
165 /* Implementation of gdb.Frame.unwind_stop_reason (self) -> Integer.
166 Returns one of the gdb.FRAME_UNWIND_* constants. */
169 frapy_unwind_stop_reason (PyObject
*self
, PyObject
*args
)
171 struct frame_info
*frame
= NULL
; /* Initialize to appease gcc warning. */
172 volatile struct gdb_exception except
;
173 enum unwind_stop_reason stop_reason
;
175 TRY_CATCH (except
, RETURN_MASK_ALL
)
177 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
179 GDB_PY_HANDLE_EXCEPTION (except
);
181 stop_reason
= get_frame_unwind_stop_reason (frame
);
183 return PyInt_FromLong (stop_reason
);
186 /* Implementation of gdb.Frame.pc (self) -> Long.
187 Returns the frame's resume address. */
190 frapy_pc (PyObject
*self
, PyObject
*args
)
192 CORE_ADDR pc
= 0; /* Initialize to appease gcc warning. */
193 struct frame_info
*frame
;
194 volatile struct gdb_exception except
;
196 TRY_CATCH (except
, RETURN_MASK_ALL
)
198 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
200 pc
= get_frame_pc (frame
);
202 GDB_PY_HANDLE_EXCEPTION (except
);
204 return PyLong_FromUnsignedLongLong (pc
);
207 /* Implementation of gdb.Frame.block (self) -> gdb.Block.
208 Returns the frame's code block. */
211 frapy_block (PyObject
*self
, PyObject
*args
)
213 struct frame_info
*frame
;
214 struct block
*block
= NULL
;
215 volatile struct gdb_exception except
;
216 struct symtab_and_line sal
;
218 TRY_CATCH (except
, RETURN_MASK_ALL
)
220 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
222 find_frame_sal (frame
, &sal
);
223 block
= block_for_pc (get_frame_address_in_block (frame
));
225 GDB_PY_HANDLE_EXCEPTION (except
);
227 if (!sal
.symtab
|| !sal
.symtab
->objfile
)
229 PyErr_SetString (PyExc_RuntimeError
,
230 "Cannot locate object file for block.");
235 return block_to_block_object (block
, sal
.symtab
->objfile
);
241 /* Implementation of gdb.Frame.function (self) -> gdb.Symbol.
242 Returns the symbol for the function corresponding to this frame. */
245 frapy_function (PyObject
*self
, PyObject
*args
)
247 struct symbol
*sym
= NULL
;
248 struct frame_info
*frame
;
249 volatile struct gdb_exception except
;
251 TRY_CATCH (except
, RETURN_MASK_ALL
)
253 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
255 sym
= find_pc_function (get_frame_address_in_block (frame
));
257 GDB_PY_HANDLE_EXCEPTION (except
);
260 return symbol_to_symbol_object (sym
);
265 /* Convert a frame_info struct to a Python Frame object.
266 Sets a Python exception and returns NULL on error. */
268 static frame_object
*
269 frame_info_to_frame_object (struct frame_info
*frame
)
271 frame_object
*frame_obj
;
273 frame_obj
= PyObject_New (frame_object
, &frame_object_type
);
274 if (frame_obj
== NULL
)
276 PyErr_SetString (PyExc_MemoryError
, "Could not allocate frame object.");
280 /* Try to get the previous frame, to determine if this is the last frame
281 in a corrupt stack. If so, we need to store the frame_id of the next
282 frame and not of this one (which is possibly invalid). */
283 if (get_prev_frame (frame
) == NULL
284 && get_frame_unwind_stop_reason (frame
) != UNWIND_NO_REASON
285 && get_next_frame (frame
) != NULL
)
287 frame_obj
->frame_id
= get_frame_id (get_next_frame (frame
));
288 frame_obj
->frame_id_is_next
= 1;
292 frame_obj
->frame_id
= get_frame_id (frame
);
293 frame_obj
->frame_id_is_next
= 0;
296 frame_obj
->gdbarch
= get_frame_arch (frame
);
301 /* Implementation of gdb.Frame.older (self) -> gdb.Frame.
302 Returns the frame immediately older (outer) to this frame, or None if
306 frapy_older (PyObject
*self
, PyObject
*args
)
308 struct frame_info
*frame
, *prev
;
309 volatile struct gdb_exception except
;
310 PyObject
*prev_obj
= NULL
; /* Initialize to appease gcc warning. */
312 TRY_CATCH (except
, RETURN_MASK_ALL
)
314 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
316 prev
= get_prev_frame (frame
);
318 prev_obj
= (PyObject
*) frame_info_to_frame_object (prev
);
325 GDB_PY_HANDLE_EXCEPTION (except
);
330 /* Implementation of gdb.Frame.newer (self) -> gdb.Frame.
331 Returns the frame immediately newer (inner) to this frame, or None if
335 frapy_newer (PyObject
*self
, PyObject
*args
)
337 struct frame_info
*frame
, *next
;
338 volatile struct gdb_exception except
;
339 PyObject
*next_obj
= NULL
; /* Initialize to appease gcc warning. */
341 TRY_CATCH (except
, RETURN_MASK_ALL
)
343 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
345 next
= get_next_frame (frame
);
347 next_obj
= (PyObject
*) frame_info_to_frame_object (next
);
354 GDB_PY_HANDLE_EXCEPTION (except
);
359 /* Implementation of gdb.Frame.find_sal (self) -> gdb.Symtab_and_line.
360 Returns the frame's symtab and line. */
363 frapy_find_sal (PyObject
*self
, PyObject
*args
)
365 struct frame_info
*frame
;
366 struct symtab_and_line sal
;
367 struct objfile
*objfile
= NULL
;
368 volatile struct gdb_exception except
;
369 PyObject
*sal_obj
= NULL
; /* Initialize to appease gcc warning. */
371 TRY_CATCH (except
, RETURN_MASK_ALL
)
373 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
375 find_frame_sal (frame
, &sal
);
376 sal_obj
= symtab_and_line_to_sal_object (sal
);
378 GDB_PY_HANDLE_EXCEPTION (except
);
383 /* Implementation of gdb.Frame.read_var_value (self, variable) -> gdb.Value.
384 Returns the value of the given variable in this frame. The argument must be
385 a string. Returns None if GDB can't find the specified variable. */
388 frapy_read_var (PyObject
*self
, PyObject
*args
)
390 struct frame_info
*frame
;
392 struct symbol
*var
= NULL
; /* gcc-4.3.2 false warning. */
393 struct value
*val
= NULL
;
394 volatile struct gdb_exception except
;
396 if (!PyArg_ParseTuple (args
, "O", &sym_obj
))
399 if (PyObject_TypeCheck (sym_obj
, &symbol_object_type
))
400 var
= symbol_object_to_symbol (sym_obj
);
401 else if (gdbpy_is_string (sym_obj
))
404 struct block
*block
= NULL
;
405 struct cleanup
*cleanup
;
406 volatile struct gdb_exception except
;
408 var_name
= python_string_to_target_string (sym_obj
);
411 cleanup
= make_cleanup (xfree
, var_name
);
413 TRY_CATCH (except
, RETURN_MASK_ALL
)
415 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
417 block
= block_for_pc (get_frame_address_in_block (frame
));
418 var
= lookup_symbol (var_name
, block
, VAR_DOMAIN
, NULL
);
420 GDB_PY_HANDLE_EXCEPTION (except
);
424 PyErr_Format (PyExc_ValueError
,
425 _("variable '%s' not found"), var_name
);
426 do_cleanups (cleanup
);
431 do_cleanups (cleanup
);
435 PyErr_SetString (PyExc_TypeError
,
436 _("argument must be a symbol or string"));
440 TRY_CATCH (except
, RETURN_MASK_ALL
)
442 FRAPY_REQUIRE_VALID ((frame_object
*) self
, frame
);
444 val
= read_var_value (var
, frame
);
446 GDB_PY_HANDLE_EXCEPTION (except
);
449 return value_to_value_object (val
);
454 /* Select this frame. */
457 frapy_select (PyObject
*self
, PyObject
*args
)
459 struct frame_info
*fi
;
460 frame_object
*frame
= (frame_object
*) self
;
461 volatile struct gdb_exception except
;
463 TRY_CATCH (except
, RETURN_MASK_ALL
)
465 FRAPY_REQUIRE_VALID (frame
, fi
);
469 GDB_PY_HANDLE_EXCEPTION (except
);
474 /* Implementation of gdb.selected_frame () -> gdb.Frame.
475 Returns the selected frame object. */
478 gdbpy_selected_frame (PyObject
*self
, PyObject
*args
)
480 struct frame_info
*frame
;
481 frame_object
*frame_obj
= NULL
; /* Initialize to appease gcc warning. */
482 volatile struct gdb_exception except
;
484 TRY_CATCH (except
, RETURN_MASK_ALL
)
486 frame
= get_selected_frame ("No frame is currently selected.");
487 frame_obj
= frame_info_to_frame_object (frame
);
489 GDB_PY_HANDLE_EXCEPTION (except
);
491 return (PyObject
*) frame_obj
;
494 /* Implementation of gdb.stop_reason_string (Integer) -> String.
495 Return a string explaining the unwind stop reason. */
498 gdbpy_frame_stop_reason_string (PyObject
*self
, PyObject
*args
)
503 if (!PyArg_ParseTuple (args
, "i", &reason
))
506 if (reason
< 0 || reason
> UNWIND_NO_SAVED_PC
)
508 PyErr_SetString (PyExc_ValueError
, "Invalid frame stop reason.");
512 str
= frame_stop_reason_string (reason
);
513 return PyUnicode_Decode (str
, strlen (str
), host_charset (), NULL
);
516 /* Implements the equality comparison for Frame objects.
517 All other comparison operators will throw a TypeError Python exception,
518 as they aren't valid for frames. */
521 frapy_richcompare (PyObject
*self
, PyObject
*other
, int op
)
525 if (!PyObject_TypeCheck (other
, &frame_object_type
)
526 || (op
!= Py_EQ
&& op
!= Py_NE
))
528 Py_INCREF (Py_NotImplemented
);
529 return Py_NotImplemented
;
532 if (frame_id_eq (((frame_object
*) self
)->frame_id
,
533 ((frame_object
*) other
)->frame_id
))
543 /* Sets up the Frame API in the gdb module. */
546 gdbpy_initialize_frames (void)
548 if (PyType_Ready (&frame_object_type
) < 0)
551 /* Note: These would probably be best exposed as class attributes of Frame,
552 but I don't know how to do it except by messing with the type's dictionary.
553 That seems too messy. */
554 PyModule_AddIntConstant (gdb_module
, "NORMAL_FRAME", NORMAL_FRAME
);
555 PyModule_AddIntConstant (gdb_module
, "DUMMY_FRAME", DUMMY_FRAME
);
556 PyModule_AddIntConstant (gdb_module
, "SIGTRAMP_FRAME", SIGTRAMP_FRAME
);
557 PyModule_AddIntConstant (gdb_module
, "SENTINEL_FRAME", SENTINEL_FRAME
);
558 PyModule_AddIntConstant (gdb_module
,
559 "FRAME_UNWIND_NO_REASON", UNWIND_NO_REASON
);
560 PyModule_AddIntConstant (gdb_module
,
561 "FRAME_UNWIND_NULL_ID", UNWIND_NULL_ID
);
562 PyModule_AddIntConstant (gdb_module
,
563 "FRAME_UNWIND_FIRST_ERROR", UNWIND_FIRST_ERROR
);
564 PyModule_AddIntConstant (gdb_module
,
565 "FRAME_UNWIND_INNER_ID", UNWIND_INNER_ID
);
566 PyModule_AddIntConstant (gdb_module
,
567 "FRAME_UNWIND_SAME_ID", UNWIND_SAME_ID
);
568 PyModule_AddIntConstant (gdb_module
,
569 "FRAME_UNWIND_NO_SAVED_PC", UNWIND_NO_SAVED_PC
);
571 Py_INCREF (&frame_object_type
);
572 PyModule_AddObject (gdb_module
, "Frame", (PyObject
*) &frame_object_type
);
577 static PyMethodDef frame_object_methods
[] = {
578 { "is_valid", frapy_is_valid
, METH_NOARGS
,
579 "is_valid () -> Boolean.\n\
580 Return true if this frame is valid, false if not." },
581 { "name", frapy_name
, METH_NOARGS
,
582 "name () -> String.\n\
583 Return the function name of the frame, or None if it can't be determined." },
584 { "type", frapy_type
, METH_NOARGS
,
585 "type () -> Integer.\n\
586 Return the type of the frame." },
587 { "unwind_stop_reason", frapy_unwind_stop_reason
, METH_NOARGS
,
588 "unwind_stop_reason () -> Integer.\n\
589 Return the reason why it's not possible to find frames older than this." },
590 { "pc", frapy_pc
, METH_NOARGS
,
592 Return the frame's resume address." },
593 { "block", frapy_block
, METH_NOARGS
,
594 "block () -> gdb.Block.\n\
595 Return the frame's code block." },
596 { "function", frapy_function
, METH_NOARGS
,
597 "function () -> gdb.Symbol.\n\
598 Returns the symbol for the function corresponding to this frame." },
599 { "older", frapy_older
, METH_NOARGS
,
600 "older () -> gdb.Frame.\n\
601 Return the frame that called this frame." },
602 { "newer", frapy_newer
, METH_NOARGS
,
603 "newer () -> gdb.Frame.\n\
604 Return the frame called by this frame." },
605 { "find_sal", frapy_find_sal
, METH_NOARGS
,
606 "find_sal () -> gdb.Symtab_and_line.\n\
607 Return the frame's symtab and line." },
608 { "read_var", frapy_read_var
, METH_VARARGS
,
609 "read_var (variable) -> gdb.Value.\n\
610 Return the value of the variable in this frame." },
611 { "select", frapy_select
, METH_NOARGS
,
612 "Select this frame as the user's current frame." },
613 {NULL
} /* Sentinel */
616 static PyTypeObject frame_object_type
= {
617 PyObject_HEAD_INIT (NULL
)
619 "gdb.Frame", /* tp_name */
620 sizeof (frame_object
), /* tp_basicsize */
628 0, /* tp_as_number */
629 0, /* tp_as_sequence */
630 0, /* tp_as_mapping */
633 frapy_str
, /* tp_str */
636 0, /* tp_as_buffer */
637 Py_TPFLAGS_DEFAULT
, /* tp_flags */
638 "GDB frame object", /* tp_doc */
641 frapy_richcompare
, /* tp_richcompare */
642 0, /* tp_weaklistoffset */
645 frame_object_methods
, /* tp_methods */
650 0, /* tp_descr_get */
651 0, /* tp_descr_set */
652 0, /* tp_dictoffset */
655 PyType_GenericNew
/* tp_new */