|
21 | 21 | from drgn.internal.rlcompleter import Completer |
22 | 22 | from drgn.internal.sudohelper import open_via_sudo |
23 | 23 |
|
24 | | -__all__ = ("run_interactive", "version_header") |
| 24 | +__all__ = ("default_globals", "run_interactive", "version_header") |
25 | 25 |
|
26 | 26 | logger = logging.getLogger("drgn") |
27 | 27 |
|
| 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 | + |
28 | 45 |
|
29 | 46 | class _LogFormatter(logging.Formatter): |
30 | 47 | _LEVELS = ( |
@@ -89,6 +106,33 @@ def version_header() -> str: |
89 | 106 | return f"drgn {drgn.__version__} (using Python {python_version}, elfutils {drgn._elfutils_version}, {libkdumpfile})" |
90 | 107 |
|
91 | 108 |
|
| 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 | + |
92 | 136 | def _identify_script(path: str) -> str: |
93 | 137 | EI_NIDENT = 16 |
94 | 138 | SIZEOF_E_TYPE = 2 |
@@ -566,44 +610,14 @@ def run_interactive( |
566 | 610 | function, applications should restore their history and settings before |
567 | 611 | using ``readline``. |
568 | 612 | """ |
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) |
592 | 614 | banner = f"""\ |
593 | 615 | For help, type help(drgn). |
594 | 616 | >>> import drgn |
595 | | ->>> from drgn import {", ".join(drgn_globals)} |
| 617 | +>>> from drgn import {", ".join(_DRGN_GLOBALS)} |
596 | 618 | >>> 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) |
601 | 619 | if prog.flags & drgn.ProgramFlags.IS_LINUX_KERNEL: |
602 | 620 | 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 | | - |
607 | 621 | if banner_func: |
608 | 622 | banner = banner_func(banner) |
609 | 623 | if globals_func: |
|
0 commit comments