mirror of https://github.com/pwndbg/pwndbg
Fix parameter default values (#1307)
* Fix parameter default values Before this commit the created gdb.Parameter default values were not set properly. Now, we set the object's .value field properly with the provided default value. * fix issue with set/show docstring * fix lint * fix lint * fix lint * fix parameter further... * fix flake8 lint
This commit is contained in:
parent
9a580eaa84
commit
20417c1b06
|
@ -39,7 +39,7 @@ def get_config_parameters(scope, filter_pattern):
|
|||
values = [
|
||||
v
|
||||
for v in values
|
||||
if filter_pattern in v.optname.lower() or filter_pattern in v.docstring.lower()
|
||||
if filter_pattern in v.name.lower() or filter_pattern in v.docstring.lower()
|
||||
]
|
||||
|
||||
return values
|
||||
|
|
|
@ -37,19 +37,17 @@ PARAM_CLASSES = {
|
|||
# https://sourceware.org/gdb/onlinedocs/gdb/Parameters-In-Python.html
|
||||
class Parameter(gdb.Parameter):
|
||||
def __init__(self, param: pwndbg.lib.config.Parameter):
|
||||
self.param = param
|
||||
|
||||
# `set_doc` and `show_doc` must be set before `gdb.Parameter.__init__`.
|
||||
# They will be used for `help set <param>` and `help show <param>`,
|
||||
# respectively
|
||||
self.set_doc = "Set " + self.param.docstring
|
||||
self.show_doc = "Show " + self.param.docstring
|
||||
super().__init__(self.param.name, gdb.COMMAND_SUPPORT, self._param_class())
|
||||
self.set_doc = "Set " + param.docstring
|
||||
self.show_doc = "Show " + param.docstring
|
||||
|
||||
def _param_class(self):
|
||||
for k, v in PARAM_CLASSES.items():
|
||||
if isinstance(self.param.value, k):
|
||||
return v
|
||||
param_class = PARAM_CLASSES[type(param.value)]
|
||||
super().__init__(param.name, gdb.COMMAND_SUPPORT, param_class)
|
||||
|
||||
self.param = param
|
||||
self.value = param.value
|
||||
|
||||
@property
|
||||
def native_value(self):
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import re
|
||||
|
||||
import gdb
|
||||
|
||||
|
||||
|
@ -11,3 +13,23 @@ def test_config():
|
|||
|
||||
gdb.execute("set global-max-fast 0x80")
|
||||
assert "'0x80' ('0')" in gdb.execute("heap_config", to_string=True)
|
||||
|
||||
|
||||
def test_config_filtering():
|
||||
out = gdb.execute("config context-code-lines", to_string=True).splitlines()
|
||||
|
||||
assert re.match(r"Name\s+Value\s+\(Def\)\s+Documentation", out[0])
|
||||
assert re.match(r"-+", out[1])
|
||||
assert re.match(
|
||||
r"context-code-lines\s+10\s+number of additional lines to print in the code context", out[2]
|
||||
)
|
||||
assert out[3] == "You can set config variable with `set <config-var> <value>`"
|
||||
assert (
|
||||
out[4]
|
||||
== "You can generate configuration file using `configfile` - then put it in your .gdbinit after initializing pwndbg"
|
||||
)
|
||||
|
||||
|
||||
def test_config_filtering_missing():
|
||||
out = gdb.execute("config asdasdasdasd", to_string=True)
|
||||
assert out == 'No config parameter found with filter "asdasdasdasd"\n'
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
import gdb
|
||||
import pytest
|
||||
|
||||
import pwndbg.gdblib.config
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"params",
|
||||
(("int", 123, "123"), ("bool", True, "on"), ("string", "some-string-val", "some-string-val")),
|
||||
)
|
||||
def test_gdb_parameter_default_value_works(start_binary, params):
|
||||
name_suffix, default_value, displayed_value = params
|
||||
|
||||
param_name = f"test-param-{name_suffix}"
|
||||
|
||||
param = pwndbg.gdblib.config.add_param(param_name, default_value, "some show string")
|
||||
|
||||
# Initialize and register param in GDB as if it would be done by gdblib.config.init_params
|
||||
pwndbg.gdblib.config_mod.Parameter(param)
|
||||
|
||||
out = gdb.execute(f"show {param_name}", to_string=True)
|
||||
assert out in (
|
||||
f"""The current value of '{param_name}' is "{displayed_value}".\n""", # GDB 12.x
|
||||
f"Show some show string {displayed_value}\n", # GDB 9.x
|
||||
)
|
||||
assert gdb.parameter(param_name) == default_value
|
||||
|
||||
# TODO/FIXME: We need to add documentation
|
||||
out = gdb.execute(f"help show {param_name}", to_string=True)
|
||||
assert out == "Show some show string\nThis command is not documented.\n"
|
||||
assert (
|
||||
gdb.execute(f"help set {param_name}", to_string=True)
|
||||
== "Set some show string\nThis command is not documented.\n"
|
||||
)
|
||||
|
||||
# TODO/FIXME: Is there a way to unregister a GDB parameter defined in Python?
|
||||
# Probably no? If the fact that we register params above ever causes issues,
|
||||
# then we should just not test it via gdb.* APIs and only check if the added param
|
||||
# has proper/expected fields set?
|
Loading…
Reference in New Issue