gdbmongo


Namegdbmongo JSON
Version 0.15.0 PyPI version JSON
download
home_pagehttps://github.com/visemet/gdb-mongodb-server
SummaryGDB pretty printers and commands for debugging the MongoDB Server
upload_time2024-04-30 04:27:06
maintainerMax Hirschhorn
docs_urlNone
authorNone
requires_python>=3.9
licenseApache License, Version 2.0
keywords mongo mongodb gdb
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ==================
gdb-mongodb-server
==================

About
=====

The *gdbmongo* package contains GDB pretty printers and commands for
debugging the MongoDB Server. Its primary target audience is MongoDB
employees.

Motivation
----------

The *gdbmongo* package is mostly born out of joy from tinkering with
low-level constructs while writing GDB pretty printers. There are a few
explicit areas for what it aims to achieve:

1. GDB pretty printers and commands which only work against live MongoDB
   processes are of limited value to the Sharding team. This is because
   very rarely does the hang analyzer actually have enough time in
   Evergreen to successfully attach to each of the processes. Only by
   good luck can it happen to have attached to the problematic one.
   GDB pretty printers and commands which are implemented by walking
   in-memory data structures and not by executing C++ code **can run
   against core dumps** and are therefore more widely applicable.

2. There are new versions of the MongoDB Server being released every
   quarter and every year. Each new git branch fragments the tooling for
   testing the server. It can cause development on older branches to
   feel foreign and awkward because so many new enhancements were made
   in the meantime. Flipping the model so there's **a single version
   which attempts to work with all supported MongoDB versions** can
   potentially enable more things to "just work." Another way to think
   about it is that the new GDB pretty printers and commands may not be
   getting built for new MongoDB Server functionality and instead may be
   getting built for a newly-recognized debugging need.

Installation
============

The *gdbmongo* package must be loaded into the Python installation that
the GDB process is running. In particular, launching ``gdb`` from within
a Python virtual environment won't give the GDB process access to the
Python packages defined within the virtual environment. This is because
``gdb`` is dynamically linked against *libpython* and therefore always
uses the site-packages of the base installation.

Adding the following snippet to a .gdbinit file will cause ``gdb`` at
launch time to attempt to install the *gdbmongo* package if it isn't
already installed.

.. code-block:: python

    # In your ~/.gdbinit:
    python
    try:
        import gdbmongo
    except ImportError:
        import sys
        if sys.prefix.startswith("/opt/mongodbtoolchain/"):
            import subprocess
            subprocess.run([sys.prefix + "/bin/python3", "-m", "pip", "install", "gdbmongo"], check=True)
            import gdbmongo
        else:
            import warnings
            warnings.warn("Not attempting to install gdbmongo into non MongoDB toolchain Python")

    if "gdbmongo" in dir():
        gdbmongo.register_printers()
    end

If you don't plan to use the GDB pretty printers defined in the
mongodb/mongo repository then you may want to consider enabling some of
the other printers defined by the *gdbmongo* package by default. Each of
the gdbmongo-\* pretty printer collections can be still enabled later on
within GDB. For example, the gdbmongo-mongo-extras pretty printer
collection can be enabled with the
``enable pretty-printer global gdbmongo-mongo-extras`` command.

.. pull-quote::

    register_printers(\*, essentials=True, stdlib=False, abseil=False, boost=False, mongo_extras=False)
        Register the pretty printers defined by the gdbmongo package with GDB itself.

        The pretty printer collections other than gdbmongo-essentials are defaulted to off to avoid
        conflicting with the pretty printers defined in the mongodb/mongo repository.

Usage
=====

The *gdbmongo* package is a nascent GDB extension and quite limited in
what it can do right now. But, if you're looking to dump the contents of
the global ``LockManager`` in a core dump, then you can run the
following commands:

.. code-block:: python

    (gdb) python lock_mgr = gdbmongo.LockManagerPrinter.from_global()
    (gdb) python print(lock_mgr.val)

Changelog
=========

0.15.0 (2024-04-29)
-------------------

* Support dumping LockManager from core dump of MongoDB 8.0.
* Fix mongo::StringData pretty printer and mongo::BSONObj pretty printer which consumes it.

0.14.0 (2023-09-30)
-------------------

* Include OperationContext* in output for LockManager dump.

0.13.0 (2023-09-29)
-------------------

* Include thread's name and number in output for LockManager dump.
* Fix detecting compiler version when cross-platform debugging.

0.12.0 (2023-09-22)
-------------------

* Support displaying thread names in core dump of MongoDB 4.4, 5.0, and 6.0.

0.11.0 (2023-09-16)
-------------------

* Support displaying contents of partitions within CursorManager.

0.10.0 (2023-09-03)
-------------------

* Support dumping LockManager from core dump of MongoDB 7.1.

0.9.0 (2023-08-26)
------------------

* Support dumping LockManager from core dump of MongoDB 7.0.

0.8.1 (2023-03-04)
------------------

* Fix two Python exceptions from thread names logic when no program or core dump was loaded.
* Fix boost::optional pretty printer for scalar types.

0.8.0 (2023-02-04)
------------------

* Always register gdbmongo pretty printers with GDB itself but continue defaulting them to off.
* Support displaying thread names in core dump of MongoDB 6.2.

0.7.0 (2022-12-24)
------------------

* Support binaries built with MongoDB v4 toolchain.

0.6.0 (2022-11-18)
------------------

* Support dumping LockManager from core dump of MongoDB 6.2.
* Fix resource type names in output of MongoDB 4.4.15, 5.0.10, and 6.0.0.

0.5.1 (2022-08-25)
------------------

* Fix detecting MongoDB toolchain from --install-action=hardlink executables.

0.5.0 (2022-07-31)
------------------

* Format BSON binary subtype 4 as UUID.
* Include ErrorExtraInfo in output for Status and StatusWith<T>.

0.4.0 (2022-04-09)
------------------

* Support detecting libstdc++ version in MongoDB binaries back to 4.2.0 and 4.4.0.
* Support decoding BSONObjs even when they contain dates exceeding datetime.MAXYEAR (= 9999).

0.3.0 (2022-03-26)
------------------

* Include database name in dump of DatabaseShardingState ResourceMutexes.
* Avoid truncating namespace strings in LockManager dump.

0.2.0 (2022-03-05)
------------------

* Support dumping LockManager from core dump of MongoDB 4.2, 4.4, and 5.0.

0.1.0 (2022-02-26)
------------------

* Initial release.
* Support dumping LockManager from core dump of MongoDB 5.3.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/visemet/gdb-mongodb-server",
    "name": "gdbmongo",
    "maintainer": "Max Hirschhorn",
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "max.hirschhorn@mongodb.com",
    "keywords": "mongo, mongodb, gdb",
    "author": null,
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/0e/94/f62091b3ed3248c0b99eb8ee20768d142ee535e1755a89682c1c43becd27/gdbmongo-0.15.0.tar.gz",
    "platform": "linux",
    "description": "==================\ngdb-mongodb-server\n==================\n\nAbout\n=====\n\nThe *gdbmongo* package contains GDB pretty printers and commands for\ndebugging the MongoDB Server. Its primary target audience is MongoDB\nemployees.\n\nMotivation\n----------\n\nThe *gdbmongo* package is mostly born out of joy from tinkering with\nlow-level constructs while writing GDB pretty printers. There are a few\nexplicit areas for what it aims to achieve:\n\n1. GDB pretty printers and commands which only work against live MongoDB\n   processes are of limited value to the Sharding team. This is because\n   very rarely does the hang analyzer actually have enough time in\n   Evergreen to successfully attach to each of the processes. Only by\n   good luck can it happen to have attached to the problematic one.\n   GDB pretty printers and commands which are implemented by walking\n   in-memory data structures and not by executing C++ code **can run\n   against core dumps** and are therefore more widely applicable.\n\n2. There are new versions of the MongoDB Server being released every\n   quarter and every year. Each new git branch fragments the tooling for\n   testing the server. It can cause development on older branches to\n   feel foreign and awkward because so many new enhancements were made\n   in the meantime. Flipping the model so there's **a single version\n   which attempts to work with all supported MongoDB versions** can\n   potentially enable more things to \"just work.\" Another way to think\n   about it is that the new GDB pretty printers and commands may not be\n   getting built for new MongoDB Server functionality and instead may be\n   getting built for a newly-recognized debugging need.\n\nInstallation\n============\n\nThe *gdbmongo* package must be loaded into the Python installation that\nthe GDB process is running. In particular, launching ``gdb`` from within\na Python virtual environment won't give the GDB process access to the\nPython packages defined within the virtual environment. This is because\n``gdb`` is dynamically linked against *libpython* and therefore always\nuses the site-packages of the base installation.\n\nAdding the following snippet to a .gdbinit file will cause ``gdb`` at\nlaunch time to attempt to install the *gdbmongo* package if it isn't\nalready installed.\n\n.. code-block:: python\n\n    # In your ~/.gdbinit:\n    python\n    try:\n        import gdbmongo\n    except ImportError:\n        import sys\n        if sys.prefix.startswith(\"/opt/mongodbtoolchain/\"):\n            import subprocess\n            subprocess.run([sys.prefix + \"/bin/python3\", \"-m\", \"pip\", \"install\", \"gdbmongo\"], check=True)\n            import gdbmongo\n        else:\n            import warnings\n            warnings.warn(\"Not attempting to install gdbmongo into non MongoDB toolchain Python\")\n\n    if \"gdbmongo\" in dir():\n        gdbmongo.register_printers()\n    end\n\nIf you don't plan to use the GDB pretty printers defined in the\nmongodb/mongo repository then you may want to consider enabling some of\nthe other printers defined by the *gdbmongo* package by default. Each of\nthe gdbmongo-\\* pretty printer collections can be still enabled later on\nwithin GDB. For example, the gdbmongo-mongo-extras pretty printer\ncollection can be enabled with the\n``enable pretty-printer global gdbmongo-mongo-extras`` command.\n\n.. pull-quote::\n\n    register_printers(\\*, essentials=True, stdlib=False, abseil=False, boost=False, mongo_extras=False)\n        Register the pretty printers defined by the gdbmongo package with GDB itself.\n\n        The pretty printer collections other than gdbmongo-essentials are defaulted to off to avoid\n        conflicting with the pretty printers defined in the mongodb/mongo repository.\n\nUsage\n=====\n\nThe *gdbmongo* package is a nascent GDB extension and quite limited in\nwhat it can do right now. But, if you're looking to dump the contents of\nthe global ``LockManager`` in a core dump, then you can run the\nfollowing commands:\n\n.. code-block:: python\n\n    (gdb) python lock_mgr = gdbmongo.LockManagerPrinter.from_global()\n    (gdb) python print(lock_mgr.val)\n\nChangelog\n=========\n\n0.15.0 (2024-04-29)\n-------------------\n\n* Support dumping LockManager from core dump of MongoDB 8.0.\n* Fix mongo::StringData pretty printer and mongo::BSONObj pretty printer which consumes it.\n\n0.14.0 (2023-09-30)\n-------------------\n\n* Include OperationContext* in output for LockManager dump.\n\n0.13.0 (2023-09-29)\n-------------------\n\n* Include thread's name and number in output for LockManager dump.\n* Fix detecting compiler version when cross-platform debugging.\n\n0.12.0 (2023-09-22)\n-------------------\n\n* Support displaying thread names in core dump of MongoDB 4.4, 5.0, and 6.0.\n\n0.11.0 (2023-09-16)\n-------------------\n\n* Support displaying contents of partitions within CursorManager.\n\n0.10.0 (2023-09-03)\n-------------------\n\n* Support dumping LockManager from core dump of MongoDB 7.1.\n\n0.9.0 (2023-08-26)\n------------------\n\n* Support dumping LockManager from core dump of MongoDB 7.0.\n\n0.8.1 (2023-03-04)\n------------------\n\n* Fix two Python exceptions from thread names logic when no program or core dump was loaded.\n* Fix boost::optional pretty printer for scalar types.\n\n0.8.0 (2023-02-04)\n------------------\n\n* Always register gdbmongo pretty printers with GDB itself but continue defaulting them to off.\n* Support displaying thread names in core dump of MongoDB 6.2.\n\n0.7.0 (2022-12-24)\n------------------\n\n* Support binaries built with MongoDB v4 toolchain.\n\n0.6.0 (2022-11-18)\n------------------\n\n* Support dumping LockManager from core dump of MongoDB 6.2.\n* Fix resource type names in output of MongoDB 4.4.15, 5.0.10, and 6.0.0.\n\n0.5.1 (2022-08-25)\n------------------\n\n* Fix detecting MongoDB toolchain from --install-action=hardlink executables.\n\n0.5.0 (2022-07-31)\n------------------\n\n* Format BSON binary subtype 4 as UUID.\n* Include ErrorExtraInfo in output for Status and StatusWith<T>.\n\n0.4.0 (2022-04-09)\n------------------\n\n* Support detecting libstdc++ version in MongoDB binaries back to 4.2.0 and 4.4.0.\n* Support decoding BSONObjs even when they contain dates exceeding datetime.MAXYEAR (= 9999).\n\n0.3.0 (2022-03-26)\n------------------\n\n* Include database name in dump of DatabaseShardingState ResourceMutexes.\n* Avoid truncating namespace strings in LockManager dump.\n\n0.2.0 (2022-03-05)\n------------------\n\n* Support dumping LockManager from core dump of MongoDB 4.2, 4.4, and 5.0.\n\n0.1.0 (2022-02-26)\n------------------\n\n* Initial release.\n* Support dumping LockManager from core dump of MongoDB 5.3.\n",
    "bugtrack_url": null,
    "license": "Apache License, Version 2.0",
    "summary": "GDB pretty printers and commands for debugging the MongoDB Server",
    "version": "0.15.0",
    "project_urls": {
        "Homepage": "https://github.com/visemet/gdb-mongodb-server"
    },
    "split_keywords": [
        "mongo",
        " mongodb",
        " gdb"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5d92cb6278c119d087ae950d1f39d70bcd9461b4ed367222ffad53004fd39b37",
                "md5": "1a68b396c90727fbf917e7d90057d424",
                "sha256": "0cc0481e8e8316ed2df69d25401376d5c7cec860cd844ee1d25648a155292eb5"
            },
            "downloads": -1,
            "filename": "gdbmongo-0.15.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "1a68b396c90727fbf917e7d90057d424",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 64045,
            "upload_time": "2024-04-30T04:27:00",
            "upload_time_iso_8601": "2024-04-30T04:27:00.144024Z",
            "url": "https://files.pythonhosted.org/packages/5d/92/cb6278c119d087ae950d1f39d70bcd9461b4ed367222ffad53004fd39b37/gdbmongo-0.15.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0e94f62091b3ed3248c0b99eb8ee20768d142ee535e1755a89682c1c43becd27",
                "md5": "4fde6f039e1ffc235a8fd8d967fbcd9e",
                "sha256": "8c8271dadee81d5b77f45c8ea4f65f99668e0fe97729bdb912a1880e0eb388e4"
            },
            "downloads": -1,
            "filename": "gdbmongo-0.15.0.tar.gz",
            "has_sig": false,
            "md5_digest": "4fde6f039e1ffc235a8fd8d967fbcd9e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 57168,
            "upload_time": "2024-04-30T04:27:06",
            "upload_time_iso_8601": "2024-04-30T04:27:06.158044Z",
            "url": "https://files.pythonhosted.org/packages/0e/94/f62091b3ed3248c0b99eb8ee20768d142ee535e1755a89682c1c43becd27/gdbmongo-0.15.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-30 04:27:06",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "visemet",
    "github_project": "gdb-mongodb-server",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "tox": true,
    "lcname": "gdbmongo"
}
        
Elapsed time: 0.24988s