[3/4] python support for fetching separate debug files: add_separate_debug_file
Commit Message
This patch provides an API call to add a separate debug file to an
objfile.
2014-11-20 Doug Evans <dje@google.com>
* NEWS: Mention gdb.Objfile.add_separate_debug_file.
* python/py-objfile.c (objfpy_add_separate_debug_file): New function.
(objfile_getset): Add "add_separate_debug_file".
doc/
* python.texi (Objfiles In Python): Document
Objfile.add_separate_debug_file.
testsuite/
* gdb.python/py-objfile.exp: Add tests for
objfile.add_separate_debug_file.
Comments
> From: Doug Evans <dje@google.com>
> Date: Thu, 20 Nov 2014 13:24:23 -0800
>
> This patch provides an API call to add a separate debug file to an
> objfile.
>
> 2014-11-20 Doug Evans <dje@google.com>
>
> * NEWS: Mention gdb.Objfile.add_separate_debug_file.
> * python/py-objfile.c (objfpy_add_separate_debug_file): New function.
> (objfile_getset): Add "add_separate_debug_file".
>
> doc/
> * python.texi (Objfiles In Python): Document
> Objfile.add_separate_debug_file.
>
> testsuite/
> * gdb.python/py-objfile.exp: Add tests for
> objfile.add_separate_debug_file.
OK for the documentation parts.
Thanks.
@@ -15,6 +15,7 @@
which is the build ID generated when the file was built.
** gdb.Objfile objects have a new attribute "have_debug_info", which is
a boolean indicating if debug information for the objfile is present.
+ ** gdb.Objfile objects have a new method "add_separate_debug_file".
** A new event "gdb.clear_objfiles" has been added, triggered when
selecting a new file to debug.
** You can now add attributes to gdb.Objfile and gdb.Progspace objects.
@@ -3522,6 +3522,17 @@ longer. All other @code{gdb.Objfile} methods will throw an exception
if it is invalid at the time the method is called.
@end defun
+@defun Objfile.add_separate_debug_file (file)
+Add @var{file} to the list of files that @value{GDBN} will search for
+debug information for the objfile.
+This is useful when the debug info has been removed from the program
+and stored in a separate file. @value{GDBN} has built-in support for
+finding separate debug info files (@pxref{Separate Debug Files}), but if
+the file doesn't live in one of the standard places that @value{GDBN}
+searches then this function can be used to add a debug info file
+from a different place.
+@end defun
+
@node Frames In Python
@subsubsection Accessing inferior stack frames from Python.
@@ -360,6 +360,33 @@ objfpy_is_valid (PyObject *self, PyObject *args)
Py_RETURN_TRUE;
}
+/* Implementation of gdb.Objfile.add_separate_debug_file (self) -> Boolean. */
+
+static PyObject *
+objfpy_add_separate_debug_file (PyObject *self, PyObject *args, PyObject *kw)
+{
+ static char *keywords[] = { "file_name", NULL };
+ objfile_object *obj = (objfile_object *) self;
+ const char *file_name;
+ int symfile_flags = 0;
+ volatile struct gdb_exception except;
+
+ OBJFPY_REQUIRE_VALID (obj);
+
+ if (!PyArg_ParseTupleAndKeywords (args, kw, "s", keywords, &file_name))
+ return NULL;
+
+ TRY_CATCH (except, RETURN_MASK_ALL)
+ {
+ bfd *abfd = symfile_bfd_open (file_name);
+
+ symbol_file_add_separate (abfd, file_name, symfile_flags, obj->objfile);
+ }
+ GDB_PY_HANDLE_EXCEPTION (except);
+
+ Py_RETURN_NONE;
+}
+
/* Clear the OBJFILE pointer in an Objfile object and remove the
@@ -427,6 +454,11 @@ static PyMethodDef objfile_object_methods[] =
"is_valid () -> Boolean.\n\
Return true if this object file is valid, false if not." },
+ { "add_separate_debug_file", (PyCFunction) objfpy_add_separate_debug_file,
+ METH_VARARGS | METH_KEYWORDS,
+ "add_separate_debug_file (file_name).\n\
+Add FILE_NAME to the list of files containing debug info for the objfile." },
+
{ NULL }
};
@@ -81,3 +81,18 @@ gdb_py_test_silent_cmd "python objfile = gdb.objfiles()\[0\]" \
gdb_test "python print (objfile.have_debug_info)" "False" \
"Get objfile have_debug_info"
+
+gdb_test "p main" "= {<text variable, no debug info>} $hex <main>" \
+ "print main without debug info"
+
+gdb_py_test_silent_cmd "python objfile.add_separate_debug_file(\"${binfile}\")" \
+ "Add separate debug file file" 1
+
+gdb_py_test_silent_cmd "python sep_objfile = gdb.objfiles()\[0\]" \
+ "Get separate debug info objfile" 1
+
+gdb_test "python print (objfile.have_debug_info)" "True" \
+ "Get have_debug_info on separate debug file"
+
+gdb_test "p main" "= {int \\(\\)} $hex <main>" \
+ "print main with debug info"