From 5df422531e28dfb5c0a5ce23fb2c407798ae46ce Mon Sep 17 00:00:00 2001 From: Jens Henrik Goebbert Date: Sat, 5 Oct 2019 15:40:18 +0200 Subject: [PATCH 1/5] Ensure "--args" is last argument of gdb command To debug an application+command line arguments "--args" is used as last command line argument of gdbgui. Everything after "--args" must be passed then to gdb also as LAST command line argument. This was not the case, but it is now ensured. By default gdb is now used in any case with "--args". --- gdbgui/statemanager.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gdbgui/statemanager.py b/gdbgui/statemanager.py index 4406361b..0c273d02 100644 --- a/gdbgui/statemanager.py +++ b/gdbgui/statemanager.py @@ -46,10 +46,11 @@ def connect_client(self, client_id: str, desired_gdbpid: int) -> Dict[str, Any]: logger.info("new sid", client_id) gdb_args = ( - deepcopy(self.config["initial_binary_and_args"]) - + deepcopy(self.config["gdb_args"]) - + REQUIRED_GDB_FLAGS - ) + REQUIRED_GDB_FLAGS + + self.config["gdb_args"] + + ["--args"] + + self.config["initial_binary_and_args"] + ) controller = GdbController( gdb_path=self.config["gdb_path"], From 767115f2e108b81b6c2aceb81f69f1eec919a3f5 Mon Sep 17 00:00:00 2001 From: Chad Smith Date: Mon, 7 Oct 2019 08:12:25 -0700 Subject: [PATCH 2/5] fix formatting --- gdbgui/statemanager.py | 3 +-- noxfile.py | 16 +++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/gdbgui/statemanager.py b/gdbgui/statemanager.py index 0c273d02..ec6d9602 100644 --- a/gdbgui/statemanager.py +++ b/gdbgui/statemanager.py @@ -1,7 +1,6 @@ import logging import traceback from collections import defaultdict -from copy import deepcopy from typing import Any, Dict, List, Optional from pygdbmi.gdbcontroller import GdbController # type: ignore @@ -50,7 +49,7 @@ def connect_client(self, client_id: str, desired_gdbpid: int) -> Dict[str, Any]: + self.config["gdb_args"] + ["--args"] + self.config["initial_binary_and_args"] - ) + ) controller = GdbController( gdb_path=self.config["gdb_path"], diff --git a/noxfile.py b/noxfile.py index 7490b1c8..409e0441 100644 --- a/noxfile.py +++ b/noxfile.py @@ -8,6 +8,7 @@ doc_dependencies = [".", "mkdocs", "mkdocs-material"] lint_dependencies = ["black", "flake8", "mypy", "check-manifest"] +files_to_lint = ["gdbgui", "tests"] + [str(p) for p in Path(".").glob("*.py")] @nox.session(python=python) @@ -53,10 +54,9 @@ def lint(session): external=True, ) session.install(*lint_dependencies) - files = ["gdbgui", "tests"] + [str(p) for p in Path(".").glob("*.py")] - session.run("black", "--check", *files) - session.run("flake8", *files) - session.run("mypy", *files) # + session.run("black", "--check", *files_to_lint) + session.run("flake8", *files_to_lint) + session.run("mypy", *files_to_lint) # session.run( "check-manifest", "--ignore", @@ -65,6 +65,12 @@ def lint(session): session.run("python", "setup.py", "check", "--metadata", "--strict") +@nox.session(python="3.7") +def autoformat(session): + session.install("black") + session.run("black", *files_to_lint) + + @nox.session(python="3.7") def docs(session): session.install(*doc_dependencies) @@ -76,7 +82,7 @@ def develop(session): session.install(*doc_dependencies, *lint_dependencies) session.install("-e", ".") command = "source %s/bin/activate" % (session.virtualenv.location_name) - session.log("Virtual Envrionment is ready to be used for development") + session.log("Virtual Environment is ready to be used for development") session.log("To use, run: '%s'", command) From f8a0c44d7d94b20e35f8143f559666f6aa1a140a Mon Sep 17 00:00:00 2001 From: Chad Smith Date: Mon, 7 Oct 2019 08:27:35 -0700 Subject: [PATCH 3/5] only pass args when they are present --- gdbgui/statemanager.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/gdbgui/statemanager.py b/gdbgui/statemanager.py index ec6d9602..8b82717b 100644 --- a/gdbgui/statemanager.py +++ b/gdbgui/statemanager.py @@ -17,6 +17,16 @@ def __init__(self, config: Dict[str, Any]): self.gdb_reader_thread = None self.config = config + def get_gdb_args(self): + gdb_args = REQUIRED_GDB_FLAGS + if self.config["gdb_args"]: + gdb_args += self.config["gdb_args"] + + if self.config["initial_binary_and_args"]: + gdb_args += ["--args"] + gdb_args += self.config["initial_binary_and_args"] + return gdb_args + def connect_client(self, client_id: str, desired_gdbpid: int) -> Dict[str, Any]: message = "" pid: Optional[int] = 0 @@ -44,12 +54,7 @@ def connect_client(self, client_id: str, desired_gdbpid: int) -> Dict[str, Any]: if self.get_controller_from_client_id(client_id) is None: logger.info("new sid", client_id) - gdb_args = ( - REQUIRED_GDB_FLAGS - + self.config["gdb_args"] - + ["--args"] - + self.config["initial_binary_and_args"] - ) + gdb_args = self.get_gdb_args() controller = GdbController( gdb_path=self.config["gdb_path"], From f025d5a9822b8de21e8f0be4f3bf4344a2d8e700 Mon Sep 17 00:00:00 2001 From: Chad Smith Date: Tue, 8 Oct 2019 09:16:27 -0700 Subject: [PATCH 4/5] add unit tests --- gdbgui/statemanager.py | 6 +++--- tests/test_main.py | 22 +++++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/gdbgui/statemanager.py b/gdbgui/statemanager.py index 8b82717b..f28232a3 100644 --- a/gdbgui/statemanager.py +++ b/gdbgui/statemanager.py @@ -2,11 +2,11 @@ import traceback from collections import defaultdict from typing import Any, Dict, List, Optional - +import copy from pygdbmi.gdbcontroller import GdbController # type: ignore -REQUIRED_GDB_FLAGS = ["--interpreter=mi2"] logger = logging.getLogger(__name__) +GDB_MI_FLAG = ["--interpreter=mi2"] class StateManager(object): @@ -18,7 +18,7 @@ def __init__(self, config: Dict[str, Any]): self.config = config def get_gdb_args(self): - gdb_args = REQUIRED_GDB_FLAGS + gdb_args = copy.copy(GDB_MI_FLAG) if self.config["gdb_args"]: gdb_args += self.config["gdb_args"] diff --git a/tests/test_main.py b/tests/test_main.py index cb91cb04..db2ead40 100755 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,22 +1,30 @@ import gdbgui import pytest # type: ignore import sys +from gdbgui.statemanager import StateManager, GDB_MI_FLAG @pytest.mark.parametrize( - "test_argv, init_bin_args, gdb_args", + "test_argv, expected_gdb_args", [ - (["gdbgui"], [], []), - (["gdbgui", "--gdb-args", "mybin -myargs"], [], ["mybin", "-myargs"]), - (["gdbgui", "--args", "mybin", "-myargs"], ["mybin", "-myargs"], []), + (["gdbgui"], GDB_MI_FLAG), + ( + ["gdbgui", "--gdb-args", "--nx --tty=/dev/ttys002 mybin -myargs"], + GDB_MI_FLAG + ["--nx", "--tty=/dev/ttys002", "mybin", "-myargs"], + ), + ( + ["gdbgui", "-n", "--args", "mybin", "-myargs"], + GDB_MI_FLAG + ["--args", "mybin", "-myargs"], + ), ], ) -def test_argument_parsing(monkeypatch, test_argv, init_bin_args, gdb_args): +def test_arguments_passed_to_gdb(monkeypatch, test_argv, expected_gdb_args): def mock_setup_backend(*args, **kwargs): pass monkeypatch.setattr(gdbgui.backend, "setup_backend", mock_setup_backend) monkeypatch.setattr(sys, "argv", test_argv) gdbgui.backend.main() - assert gdbgui.backend.app.config.get("initial_binary_and_args") == init_bin_args - assert gdbgui.backend.app.config.get("gdb_args") == gdb_args + + state = StateManager(gdbgui.backend.app.config) + assert len(state.get_gdb_args()) == len(expected_gdb_args) From 88c0983a21f6fd48e0ca76343cd91bc26e6f2052 Mon Sep 17 00:00:00 2001 From: Chad Smith Date: Tue, 8 Oct 2019 09:23:51 -0700 Subject: [PATCH 5/5] add additional test case --- tests/test_main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_main.py b/tests/test_main.py index db2ead40..ea13fd56 100755 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -8,6 +8,7 @@ "test_argv, expected_gdb_args", [ (["gdbgui"], GDB_MI_FLAG), + (["gdbgui", "mybin -myargs"], GDB_MI_FLAG + ["mybin", "-myargs"]), ( ["gdbgui", "--gdb-args", "--nx --tty=/dev/ttys002 mybin -myargs"], GDB_MI_FLAG + ["--nx", "--tty=/dev/ttys002", "mybin", "-myargs"],