Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 13 additions & 8 deletions gdbgui/statemanager.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import logging
import traceback
from collections import defaultdict
from copy import deepcopy
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):
Expand All @@ -18,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 = copy.copy(GDB_MI_FLAG)
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
Expand Down Expand Up @@ -45,11 +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 = (
deepcopy(self.config["initial_binary_and_args"])
+ deepcopy(self.config["gdb_args"])
+ REQUIRED_GDB_FLAGS
)
gdb_args = self.get_gdb_args()

controller = GdbController(
gdb_path=self.config["gdb_path"],
Expand Down
16 changes: 11 additions & 5 deletions noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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",
Expand All @@ -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)
Expand All @@ -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)


Expand Down
23 changes: 16 additions & 7 deletions tests/test_main.py
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
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", "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"],
),
(
["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)