Skip to content

Commit 1b05b8c

Browse files
brenns10osandov
authored andcommitted
cli: extract out default_globals()
Drgn has a set of globals provided in interactive mode, but they can be useful to other modes (e.g. for executing statements directly). They may also be useful to client code. Make this a separate, public helper. It does make the globals_func argument to run_interactive() a bit much, but that's ok. Signed-off-by: Stephen Brennan <[email protected]>
1 parent 3736aba commit 1b05b8c

File tree

1 file changed

+47
-33
lines changed

1 file changed

+47
-33
lines changed

drgn/cli.py

Lines changed: 47 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,27 @@
2121
from drgn.internal.rlcompleter import Completer
2222
from drgn.internal.sudohelper import open_via_sudo
2323

24-
__all__ = ("run_interactive", "version_header")
24+
__all__ = ("default_globals", "run_interactive", "version_header")
2525

2626
logger = logging.getLogger("drgn")
2727

28+
# The list of attributes from the drgn module which are imported and inserted
29+
# into the global namespace for interactive debugging.
30+
_DRGN_GLOBALS = [
31+
"FaultError",
32+
"NULL",
33+
"Object",
34+
"alignof",
35+
"cast",
36+
"container_of",
37+
"execscript",
38+
"implicit_convert",
39+
"offsetof",
40+
"reinterpret",
41+
"sizeof",
42+
"stack_trace",
43+
]
44+
2845

2946
class _LogFormatter(logging.Formatter):
3047
_LEVELS = (
@@ -89,6 +106,33 @@ def version_header() -> str:
89106
return f"drgn {drgn.__version__} (using Python {python_version}, elfutils {drgn._elfutils_version}, {libkdumpfile})"
90107

91108

109+
def default_globals(prog: drgn.Program) -> Dict[str, Any]:
110+
"""
111+
Return the default globals for an interactive drgn session
112+
113+
:param prog: the program which will be debugged
114+
:return: a dict of globals
115+
"""
116+
# Don't forget to update the default banner in run_interactive()
117+
# with any new additions.
118+
init_globals: Dict[str, Any] = {
119+
"prog": prog,
120+
"drgn": drgn,
121+
"__name__": "__main__",
122+
"__doc__": None,
123+
}
124+
for attr in _DRGN_GLOBALS:
125+
init_globals[attr] = getattr(drgn, attr)
126+
module = importlib.import_module("drgn.helpers.common")
127+
for name in module.__dict__["__all__"]:
128+
init_globals[name] = getattr(module, name)
129+
if prog.flags & drgn.ProgramFlags.IS_LINUX_KERNEL:
130+
module = importlib.import_module("drgn.helpers.linux")
131+
for name in module.__dict__["__all__"]:
132+
init_globals[name] = getattr(module, name)
133+
return init_globals
134+
135+
92136
def _identify_script(path: str) -> str:
93137
EI_NIDENT = 16
94138
SIZEOF_E_TYPE = 2
@@ -566,44 +610,14 @@ def run_interactive(
566610
function, applications should restore their history and settings before
567611
using ``readline``.
568612
"""
569-
init_globals: Dict[str, Any] = {
570-
"prog": prog,
571-
"drgn": drgn,
572-
"__name__": "__main__",
573-
"__doc__": None,
574-
}
575-
drgn_globals = [
576-
"FaultError",
577-
"NULL",
578-
"Object",
579-
"alignof",
580-
"cast",
581-
"container_of",
582-
"execscript",
583-
"implicit_convert",
584-
"offsetof",
585-
"reinterpret",
586-
"sizeof",
587-
"stack_trace",
588-
]
589-
for attr in drgn_globals:
590-
init_globals[attr] = getattr(drgn, attr)
591-
613+
init_globals = default_globals(prog)
592614
banner = f"""\
593615
For help, type help(drgn).
594616
>>> import drgn
595-
>>> from drgn import {", ".join(drgn_globals)}
617+
>>> from drgn import {", ".join(_DRGN_GLOBALS)}
596618
>>> from drgn.helpers.common import *"""
597-
598-
module = importlib.import_module("drgn.helpers.common")
599-
for name in module.__dict__["__all__"]:
600-
init_globals[name] = getattr(module, name)
601619
if prog.flags & drgn.ProgramFlags.IS_LINUX_KERNEL:
602620
banner += "\n>>> from drgn.helpers.linux import *"
603-
module = importlib.import_module("drgn.helpers.linux")
604-
for name in module.__dict__["__all__"]:
605-
init_globals[name] = getattr(module, name)
606-
607621
if banner_func:
608622
banner = banner_func(banner)
609623
if globals_func:

0 commit comments

Comments
 (0)