Details
-
Improvement
-
Resolution: Unresolved
-
Major - P3
-
None
-
None
-
Server Tooling & Methods
Description
Proposed directory structure:
- gdb/mongo/__init__.py: see below
- gdb/mongo/commandutil.py: see below
- gdb/mongo/backtrace.py: mongodb-uniqstack (
SERVER-27877), mongodb-bt-active-only (SERVER-27727) - gdb/mongo/locking.py: mongodb-show-locks (
SERVER-27874), mongodb-waitsfor-graph (SERVER-27874), mongodb-deadlock-detect (not filed yet) - gdb/mongo/printers.py: All XXPrinter classes and the build_pretty_printer() function from
SERVER-26634
The .gdbinit file and hang_analyzer.py would then source buildscripts/gdb/mongo/.
|
gdb/mongo/__init__.py |
from __future__ import absolute_import |
|
|
import importlib as _importlib |
import pkgutil as _pkgutil |
|
|
def _load_all_modules(): |
"""Dynamically loads all modules in the 'mongo' package so that any |
commands declared within them are registered.
|
"""
|
|
|
for (_, module, _) in _pkgutil.walk_packages(path=__path__): |
_importlib.import_module("." + module, package=__name__) |
|
|
_load_all_modules()
|
|
gdb/mongo/commandutil.py |
from __future__ import absolute_import |
|
|
# TODO: Combine the logic of this function with register_mongo_command() to support the
|
# "mongodb-help" command.
|
def register(name, command_class, **kwargs): |
"""Registers a gdb command.
|
|
|
@commandutil.register("hello-world", gdb.COMMAND_USER) |
class HelloWorld(gdb.Command): |
'''Greet the whole world.''' |
|
|
def invoke(self, arg, from_tty): |
print("Hello, World!") |
"""
|
|
|
def wrapper(cls): |
# A GDB command is registered by calling gdb.Command.__init__(). We construct an instance of |
# 'cls' so the command is automatically registered as a result of decorating a class with |
# the register() function. |
cls(name, command_class, **kwargs) |
return cls |
return wrapper |