[PR/24474] Add gdb.lookup_static_symbol to the python API

Similar to lookup_global_symbol, except that it checks the
STATIC_SCOPE.

gdb/ChangeLog:

2019-07-30  Christian Biesinger  <cbiesinger@google.com>

	PR/24474: Add a function to lookup static variables.
	* NEWS: Mention this new function.
	* python/py-symbol.c (gdbpy_lookup_static_symbol): New function.
	* python/python-internal.h (gdbpy_lookup_static_symbol): New function.
	* python/python.c (python_GdbMethods): Add new function.

gdb/doc/ChangeLog:

2019-07-30  Christian Biesinger  <cbiesinger@google.com>

	* python.texi (Symbols In Python): Document new function
	gdb.lookup_static_symbol.

gdb/testsuite/ChangeLog:

2019-07-30  Christian Biesinger  <cbiesinger@google.com>

	* gdb.python/py-symbol.c: Add a static variable and one in an anonymous
	namespace.
	* gdb.python/py-symbol.exp: Test gdb.lookup_static_symbol.
This commit is contained in:
Christian Biesinger 2019-07-30 11:04:37 -05:00
parent 5c4dde850c
commit 2906593ffe
10 changed files with 116 additions and 0 deletions

View file

@ -1,3 +1,11 @@
2019-07-30 Christian Biesinger <cbiesinger@google.com>
PR/24474: Add a function to lookup static variables.
* NEWS: Mention this new function.
* python/py-symbol.c (gdbpy_lookup_static_symbol): New function.
* python/python-internal.h (gdbpy_lookup_static_symbol): New function.
* python/python.c (python_GdbMethods): Add new function.
2019-07-29 Christian Biesinger <cbiesinger@google.com> 2019-07-29 Christian Biesinger <cbiesinger@google.com>
* NEWS: Mention new functions Objfile.lookup_{global,static}_symbol. * NEWS: Mention new functions Objfile.lookup_{global,static}_symbol.

View file

@ -41,6 +41,9 @@
there are no filters, or when the 'backtrace' '-no-filters' option there are no filters, or when the 'backtrace' '-no-filters' option
is given. is given.
** The new function gdb.lookup_static_symbol can be used to look up
symbols with static linkage.
** gdb.Objfile has new methods 'lookup_global_symbol' and ** gdb.Objfile has new methods 'lookup_global_symbol' and
'lookup_static_symbol' to lookup a symbol from this objfile only. 'lookup_static_symbol' to lookup a symbol from this objfile only.

View file

@ -1,3 +1,8 @@
2019-07-30 Christian Biesinger <cbiesinger@google.com>
* python.texi (Symbols In Python): Document new function
gdb.lookup_static_symbol.
2019-07-29 Christian Biesinger <cbiesinger@google.com> 2019-07-29 Christian Biesinger <cbiesinger@google.com>
* python.texi (Objfiles In Python): Document new functions * python.texi (Objfiles In Python): Document new functions

View file

@ -4847,6 +4847,25 @@ The result is a @code{gdb.Symbol} object or @code{None} if the symbol
is not found. is not found.
@end defun @end defun
@findex gdb.lookup_static_symbol
@defun gdb.lookup_static_symbol (name @r{[}, domain@r{]})
This function searches for a global symbol with static linkage by name.
The search scope can be restricted to by the domain argument.
@var{name} is the name of the symbol. It must be a string.
The optional @var{domain} argument restricts the search to the domain type.
The @var{domain} argument must be a domain constant defined in the @code{gdb}
module and described later in this chapter.
The result is a @code{gdb.Symbol} object or @code{None} if the symbol
is not found.
Note that this function will not find function-scoped static variables. To look
up such variables, iterate over the variables of the function's
@code{gdb.Block} and check that @code{block.addr_class} is
@code{gdb.SYMBOL_LOC_STATIC}.
@end defun
A @code{gdb.Symbol} object has the following attributes: A @code{gdb.Symbol} object has the following attributes:
@defvar Symbol.type @defvar Symbol.type

View file

@ -471,6 +471,46 @@ gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *kw)
return sym_obj; return sym_obj;
} }
/* Implementation of
gdb.lookup_static_symbol (name [, domain) -> symbol or None. */
PyObject *
gdbpy_lookup_static_symbol (PyObject *self, PyObject *args, PyObject *kw)
{
const char *name;
int domain = VAR_DOMAIN;
static const char *keywords[] = { "name", "domain", NULL };
struct symbol *symbol = NULL;
PyObject *sym_obj;
if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|i", keywords, &name,
&domain))
return NULL;
try
{
symbol = lookup_static_symbol (name, (domain_enum) domain).symbol;
}
catch (const gdb_exception &except)
{
GDB_PY_HANDLE_EXCEPTION (except);
}
if (symbol)
{
sym_obj = symbol_to_symbol_object (symbol);
if (!sym_obj)
return NULL;
}
else
{
sym_obj = Py_None;
Py_INCREF (Py_None);
}
return sym_obj;
}
/* This function is called when an objfile is about to be freed. /* This function is called when an objfile is about to be freed.
Invalidate the symbol as further actions on the symbol would result Invalidate the symbol as further actions on the symbol would result
in bad data. All access to obj->symbol should be gated by in bad data. All access to obj->symbol should be gated by

View file

@ -424,6 +424,8 @@ PyObject *gdbpy_frame_stop_reason_string (PyObject *, PyObject *);
PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw); PyObject *gdbpy_lookup_symbol (PyObject *self, PyObject *args, PyObject *kw);
PyObject *gdbpy_lookup_global_symbol (PyObject *self, PyObject *args, PyObject *gdbpy_lookup_global_symbol (PyObject *self, PyObject *args,
PyObject *kw); PyObject *kw);
PyObject *gdbpy_lookup_static_symbol (PyObject *self, PyObject *args,
PyObject *kw);
PyObject *gdbpy_start_recording (PyObject *self, PyObject *args); PyObject *gdbpy_start_recording (PyObject *self, PyObject *args);
PyObject *gdbpy_current_recording (PyObject *self, PyObject *args); PyObject *gdbpy_current_recording (PyObject *self, PyObject *args);
PyObject *gdbpy_stop_recording (PyObject *self, PyObject *args); PyObject *gdbpy_stop_recording (PyObject *self, PyObject *args);

View file

@ -1978,6 +1978,10 @@ a boolean indicating if name is a field of the current implied argument\n\
METH_VARARGS | METH_KEYWORDS, METH_VARARGS | METH_KEYWORDS,
"lookup_global_symbol (name [, domain]) -> symbol\n\ "lookup_global_symbol (name [, domain]) -> symbol\n\
Return the symbol corresponding to the given name (or None)." }, Return the symbol corresponding to the given name (or None)." },
{ "lookup_static_symbol", (PyCFunction) gdbpy_lookup_static_symbol,
METH_VARARGS | METH_KEYWORDS,
"lookup_static_symbol (name [, domain]) -> symbol\n\
Return the static-linkage symbol corresponding to the given name (or None)." },
{ "lookup_objfile", (PyCFunction) gdbpy_lookup_objfile, { "lookup_objfile", (PyCFunction) gdbpy_lookup_objfile,
METH_VARARGS | METH_KEYWORDS, METH_VARARGS | METH_KEYWORDS,

View file

@ -1,3 +1,9 @@
2019-07-30 Christian Biesinger <cbiesinger@google.com>
* gdb.python/py-symbol.c: Add a static variable and one in an anonymous
namespace.
* gdb.python/py-symbol.exp: Test gdb.lookup_static_symbol.
2019-07-30 Tom de Vries <tdevries@suse.de> 2019-07-30 Tom de Vries <tdevries@suse.de>
* lib/read1.c (read): Don't use unsetenv (v), use setenv (v, "", 1) * lib/read1.c (read): Don't use unsetenv (v), use setenv (v, "", 1)

View file

@ -32,9 +32,14 @@ class SimpleClass
return i; /* Break in class. */ return i; /* Break in class. */
} }
}; };
namespace {
int anon = 10;
};
#endif #endif
int qq = 72; /* line of qq */ int qq = 72; /* line of qq */
static int rr = 42; /* line of rr */
int func (int arg) int func (int arg)
{ {

View file

@ -48,6 +48,25 @@ gdb_test "python print (gdb.lookup_global_symbol('qq').needs_frame)" \
"False" \ "False" \
"print whether qq needs a frame" "print whether qq needs a frame"
set rr_line [gdb_get_line_number "line of rr"]
gdb_test "python print (gdb.lookup_global_symbol ('rr') is None)" "True" \
"lookup_global_symbol for static var"
gdb_test "python print (gdb.lookup_static_symbol ('rr').line)" "$rr_line" \
"print line number of rr"
gdb_test "python print (gdb.lookup_static_symbol ('rr').value ())" "42" \
"print value of rr"
gdb_test "python print (gdb.lookup_static_symbol ('rr').needs_frame)" \
"False" \
"print whether rr needs a frame"
gdb_test "python print (gdb.lookup_static_symbol ('nonexistent') is None)" \
"True" "lookup_static_symbol for nonexistent var"
gdb_test "python print (gdb.lookup_static_symbol ('qq') is None)" \
"True" "lookup_static_symbol for global var"
if ![runto_main] then { if ![runto_main] then {
fail "can't run to main" fail "can't run to main"
@ -137,6 +156,11 @@ gdb_start
gdb_reinitialize_dir $srcdir/$subdir gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}-cxx gdb_load ${binfile}-cxx
gdb_test "python print (gdb.lookup_global_symbol ('(anonymous namespace)::anon') is None)" \
"True" "anon is None"
gdb_test "python print (gdb.lookup_static_symbol ('(anonymous namespace)::anon').value ())" \
"10" "print value of anon"
if ![runto_main] then { if ![runto_main] then {
fail "can't run to main" fail "can't run to main"
return 0 return 0