forked from Imagelibrary/binutils-gdb
Add a way to temporarily set a gdb parameter from Python
It's sometimes useful to temporarily set some gdb parameter from
Python. Now that the 'endian' crash is fixed, and now that the
current language is no longer captured by the Python layer, it seems
reasonable to add a helper function for this situation.
This adds a new gdb.with_parameter function. This creates a context
manager which temporarily sets some parameter to a specified value.
The old value is restored when the context is exited. This is most
useful with the Python "with" statement:
with gdb.with_parameter('language', 'ada'):
... do Ada stuff
This also adds a simple function to set a parameter,
gdb.set_parameter, as suggested by Andrew.
This is PR python/10790.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=10790
This commit is contained in:
7
gdb/NEWS
7
gdb/NEWS
@@ -146,6 +146,13 @@ show debug lin-lwp
|
|||||||
** New function gdb.host_charset(), returns a string, which is the
|
** New function gdb.host_charset(), returns a string, which is the
|
||||||
name of the current host charset.
|
name of the current host charset.
|
||||||
|
|
||||||
|
** New gdb.set_parameter(NAME, VALUE). This sets the gdb parameter
|
||||||
|
NAME to VALUE.
|
||||||
|
|
||||||
|
** New gdb.with_parameter(NAME, VALUE). This returns a context
|
||||||
|
manager that temporarily sets the gdb parameter NAME to VALUE,
|
||||||
|
then resets it when the context is exited.
|
||||||
|
|
||||||
* New features in the GDB remote stub, GDBserver
|
* New features in the GDB remote stub, GDBserver
|
||||||
|
|
||||||
** GDBserver is now supported on OpenRISC GNU/Linux.
|
** GDBserver is now supported on OpenRISC GNU/Linux.
|
||||||
|
|||||||
@@ -332,6 +332,32 @@ parameter's value is converted to a Python value of the appropriate
|
|||||||
type, and returned.
|
type, and returned.
|
||||||
@end defun
|
@end defun
|
||||||
|
|
||||||
|
@findex gdb.set_parameter
|
||||||
|
@defun gdb.set_parameter (name, value)
|
||||||
|
Sets the gdb parameter @var{name} to @var{value}. As with
|
||||||
|
@code{gdb.parameter}, the parameter name string may contain spaces if
|
||||||
|
the parameter has a multi-part name.
|
||||||
|
@end defun
|
||||||
|
|
||||||
|
@findex gdb.with_parameter
|
||||||
|
@defun gdb.with_parameter (name, value)
|
||||||
|
Create a Python context manager (for use with the Python
|
||||||
|
@command{with} statement) that temporarily sets the gdb parameter
|
||||||
|
@var{name} to @var{value}. On exit from the context, the previous
|
||||||
|
value will be restored.
|
||||||
|
|
||||||
|
This uses @code{gdb.parameter} in its implementation, so it can throw
|
||||||
|
the same exceptions as that function.
|
||||||
|
|
||||||
|
For example, it's sometimes useful to evaluate some Python code with a
|
||||||
|
particular gdb language:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
with gdb.with_parameter('language', 'pascal'):
|
||||||
|
... language-specific operations
|
||||||
|
@end smallexample
|
||||||
|
@end defun
|
||||||
|
|
||||||
@findex gdb.history
|
@findex gdb.history
|
||||||
@defun gdb.history (number)
|
@defun gdb.history (number)
|
||||||
Return a value from @value{GDBN}'s value history (@pxref{Value
|
Return a value from @value{GDBN}'s value history (@pxref{Value
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import traceback
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import _gdb
|
import _gdb
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
# Python 3 moved "reload"
|
# Python 3 moved "reload"
|
||||||
if sys.version_info >= (3, 4):
|
if sys.version_info >= (3, 4):
|
||||||
@@ -231,6 +232,24 @@ def find_pc_line(pc):
|
|||||||
return current_progspace().find_pc_line(pc)
|
return current_progspace().find_pc_line(pc)
|
||||||
|
|
||||||
|
|
||||||
|
def set_parameter(name, value):
|
||||||
|
"""Set the GDB parameter NAME to VALUE."""
|
||||||
|
execute('set ' + name + ' ' + str(value), to_string=True)
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def with_parameter(name, value):
|
||||||
|
"""Temporarily set the GDB parameter NAME to VALUE.
|
||||||
|
Note that this is a context manager."""
|
||||||
|
old_value = parameter(name)
|
||||||
|
set_parameter(name, value)
|
||||||
|
try:
|
||||||
|
# Nothing that useful to return.
|
||||||
|
yield None
|
||||||
|
finally:
|
||||||
|
set_parameter(name, old_value)
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from pygments import formatters, lexers, highlight
|
from pygments import formatters, lexers, highlight
|
||||||
|
|
||||||
|
|||||||
@@ -55,6 +55,19 @@ test_lookup_type "objective-c" "char"
|
|||||||
|
|
||||||
test_lookup_type "pascal" "char"
|
test_lookup_type "pascal" "char"
|
||||||
|
|
||||||
|
gdb_test "show language" \
|
||||||
|
"The current source language is .pascal.." \
|
||||||
|
"show language before 'with'"
|
||||||
|
gdb_test_multiline "look up type using set_parameter" \
|
||||||
|
"python" "" \
|
||||||
|
"with gdb.with_parameter('language', 'ada'):" "" \
|
||||||
|
" print(gdb.lookup_type('character'))" "" \
|
||||||
|
"end" "character"
|
||||||
|
gdb_test "show language" \
|
||||||
|
"The current source language is .pascal.." \
|
||||||
|
"show language after 'with'"
|
||||||
|
|
||||||
|
|
||||||
# Ensure that the language can be changed from within Python and still
|
# Ensure that the language can be changed from within Python and still
|
||||||
# affect the results.
|
# affect the results.
|
||||||
gdb_test_multiline "look up ada type from another language" \
|
gdb_test_multiline "look up ada type from another language" \
|
||||||
@@ -62,3 +75,8 @@ gdb_test_multiline "look up ada type from another language" \
|
|||||||
"gdb.execute('set language ada')" "" \
|
"gdb.execute('set language ada')" "" \
|
||||||
"print(gdb.lookup_type('character'))" "" \
|
"print(gdb.lookup_type('character'))" "" \
|
||||||
"end" "character"
|
"end" "character"
|
||||||
|
|
||||||
|
gdb_test_no_output "python gdb.set_parameter('language', 'rust')"
|
||||||
|
gdb_test "show language" \
|
||||||
|
"The current source language is .rust.." \
|
||||||
|
"show language after 'set_parameter'"
|
||||||
|
|||||||
Reference in New Issue
Block a user