Skip to content

Commit 4c743ad

Browse files
jhgoebbertChad Smith
and
Chad Smith
committed
Ensure "--args" is last argument of gdb command (#296)
* 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". * fix formatting * only pass args when they are present * add unit tests * add additional test case Co-authored-by: Chad Smith <[email protected]>
1 parent 739238f commit 4c743ad

File tree

3 files changed

+40
-20
lines changed

3 files changed

+40
-20
lines changed

gdbgui/statemanager.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import logging
22
import traceback
33
from collections import defaultdict
4-
from copy import deepcopy
54
from typing import Any, Dict, List, Optional
6-
5+
import copy
76
from pygdbmi.gdbcontroller import GdbController # type: ignore
87

9-
REQUIRED_GDB_FLAGS = ["--interpreter=mi2"]
108
logger = logging.getLogger(__name__)
9+
GDB_MI_FLAG = ["--interpreter=mi2"]
1110

1211

1312
class StateManager(object):
@@ -18,6 +17,16 @@ def __init__(self, config: Dict[str, Any]):
1817
self.gdb_reader_thread = None
1918
self.config = config
2019

20+
def get_gdb_args(self):
21+
gdb_args = copy.copy(GDB_MI_FLAG)
22+
if self.config["gdb_args"]:
23+
gdb_args += self.config["gdb_args"]
24+
25+
if self.config["initial_binary_and_args"]:
26+
gdb_args += ["--args"]
27+
gdb_args += self.config["initial_binary_and_args"]
28+
return gdb_args
29+
2130
def connect_client(self, client_id: str, desired_gdbpid: int) -> Dict[str, Any]:
2231
message = ""
2332
pid: Optional[int] = 0
@@ -45,11 +54,7 @@ def connect_client(self, client_id: str, desired_gdbpid: int) -> Dict[str, Any]:
4554
if self.get_controller_from_client_id(client_id) is None:
4655
logger.info("new sid", client_id)
4756

48-
gdb_args = (
49-
deepcopy(self.config["initial_binary_and_args"])
50-
+ deepcopy(self.config["gdb_args"])
51-
+ REQUIRED_GDB_FLAGS
52-
)
57+
gdb_args = self.get_gdb_args()
5358

5459
controller = GdbController(
5560
gdb_path=self.config["gdb_path"],

noxfile.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
doc_dependencies = [".", "mkdocs", "mkdocs-material"]
1010
lint_dependencies = ["black", "flake8", "mypy", "check-manifest"]
11+
files_to_lint = ["gdbgui", "tests"] + [str(p) for p in Path(".").glob("*.py")]
1112

1213

1314
@nox.session(python=python)
@@ -53,10 +54,9 @@ def lint(session):
5354
external=True,
5455
)
5556
session.install(*lint_dependencies)
56-
files = ["gdbgui", "tests"] + [str(p) for p in Path(".").glob("*.py")]
57-
session.run("black", "--check", *files)
58-
session.run("flake8", *files)
59-
session.run("mypy", *files) #
57+
session.run("black", "--check", *files_to_lint)
58+
session.run("flake8", *files_to_lint)
59+
session.run("mypy", *files_to_lint) #
6060
session.run(
6161
"check-manifest",
6262
"--ignore",
@@ -65,6 +65,12 @@ def lint(session):
6565
session.run("python", "setup.py", "check", "--metadata", "--strict")
6666

6767

68+
@nox.session(python="3.7")
69+
def autoformat(session):
70+
session.install("black")
71+
session.run("black", *files_to_lint)
72+
73+
6874
@nox.session(python="3.7")
6975
def docs(session):
7076
session.install(*doc_dependencies)
@@ -76,7 +82,7 @@ def develop(session):
7682
session.install(*doc_dependencies, *lint_dependencies)
7783
session.install("-e", ".")
7884
command = "source %s/bin/activate" % (session.virtualenv.location_name)
79-
session.log("Virtual Envrionment is ready to be used for development")
85+
session.log("Virtual Environment is ready to be used for development")
8086
session.log("To use, run: '%s'", command)
8187

8288

tests/test_main.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,31 @@
11
import gdbgui
22
import pytest # type: ignore
33
import sys
4+
from gdbgui.statemanager import StateManager, GDB_MI_FLAG
45

56

67
@pytest.mark.parametrize(
7-
"test_argv, init_bin_args, gdb_args",
8+
"test_argv, expected_gdb_args",
89
[
9-
(["gdbgui"], [], []),
10-
(["gdbgui", "--gdb-args", "mybin -myargs"], [], ["mybin", "-myargs"]),
11-
(["gdbgui", "--args", "mybin", "-myargs"], ["mybin", "-myargs"], []),
10+
(["gdbgui"], GDB_MI_FLAG),
11+
(["gdbgui", "mybin -myargs"], GDB_MI_FLAG + ["mybin", "-myargs"]),
12+
(
13+
["gdbgui", "--gdb-args", "--nx --tty=/dev/ttys002 mybin -myargs"],
14+
GDB_MI_FLAG + ["--nx", "--tty=/dev/ttys002", "mybin", "-myargs"],
15+
),
16+
(
17+
["gdbgui", "-n", "--args", "mybin", "-myargs"],
18+
GDB_MI_FLAG + ["--args", "mybin", "-myargs"],
19+
),
1220
],
1321
)
14-
def test_argument_parsing(monkeypatch, test_argv, init_bin_args, gdb_args):
22+
def test_arguments_passed_to_gdb(monkeypatch, test_argv, expected_gdb_args):
1523
def mock_setup_backend(*args, **kwargs):
1624
pass
1725

1826
monkeypatch.setattr(gdbgui.backend, "setup_backend", mock_setup_backend)
1927
monkeypatch.setattr(sys, "argv", test_argv)
2028
gdbgui.backend.main()
21-
assert gdbgui.backend.app.config.get("initial_binary_and_args") == init_bin_args
22-
assert gdbgui.backend.app.config.get("gdb_args") == gdb_args
29+
30+
state = StateManager(gdbgui.backend.app.config)
31+
assert len(state.get_gdb_args()) == len(expected_gdb_args)

0 commit comments

Comments
 (0)