pygdbmi


Namepygdbmi JSON
Version 0.11.0.0 PyPI version JSON
download
home_pagehttps://github.com/cs01/pygdbmi
SummaryParse gdb machine interface output with Python
upload_time2023-01-29 16:10:55
maintainer
docs_urlNone
authorChad Smith
requires_python
licenseMIT
keywords gdb python machine-interface parse frontend
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <h1 align="center">
pygdbmi - Get Structured Output from GDB's Machine Interface
</h1>

<p align="center">

<a href="https://github.com/cs01/pygdbmi/actions">
<img src="https://github.com/cs01/pygdbmi/workflows/Tests/badge.svg?branch=master" alt="Test status" /></a>

<a href="https://badge.fury.io/py/pygdbmi">
<img src="https://badge.fury.io/py/pygdbmi.svg" alt="PyPI version"/></a>

</p>

**Documentation** [https://cs01.github.io/pygdbmi](https://cs01.github.io/pygdbmi)

**Source Code** [https://github.com/cs01/pygdbmi](https://github.com/cs01/pygdbmi)

---

Python (**py**) [**gdb**](https://www.gnu.org/software/gdb/) machine interface [(**mi**)](https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI.html)

> GDB/MI is a line based machine oriented text interface to GDB and is activated by specifying using the --interpreter command line option (see Mode Options). It is specifically intended to support the development of systems which use the debugger as just one small component of a larger system.

## What's in the box?

1.  A function to parse gdb machine interface string output and return structured data types (Python dicts) that are JSON serializable. Useful for writing the backend to a gdb frontend. For example, [gdbgui](https://github.com/cs01/gdbgui) uses pygdbmi on the backend.
2.  A Python class to control and interact with gdb as a subprocess

To get [machine interface](https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI.html) output from gdb, run gdb with the `--interpreter=mi2` flag like so:

```
gdb --interpreter=mi2
```

## Installation

    pip install pygdbmi

## Compatibility

### Operating Systems

Cross platform support for Linux, macOS and Windows

- Linux/Unix

  Ubuntu 14.04 and 16.04 have been tested to work. Other versions likely work as well.

- macOS

  Note: the error `please check gdb is codesigned - see taskgated(8)` can be fixed by codesigning gdb with [these instructions](http://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/). If the error is not fixed, please [create an issue in github](https://github.com/cs01/pygdbmi/issues).

- Windows

  Windows 10 has been tested to work with MinGW and cygwin.

### gdb versions

- gdb 7.6+ has been tested. Older versions may work as well.

## Examples

gdb mi defines a syntax for its output that is suitable for machine readability and scripting: [example output](https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Simple-Examples.html#GDB_002fMI-Simple-Examples):

```
-> -break-insert main
<- ^done,bkpt={number="1",type="breakpoint",disp="keep",
enabled="y",addr="0x08048564",func="main",file="myprog.c",
fullname="/home/myprog.c",line="68",thread-groups=["i1"],
times="0"}
<- (gdb)
```

Use `pygdbmi.gdbmiparser.parse_response` to turn that string output into a JSON serializable dictionary

```python
from pygdbmi import gdbmiparser
from pprint import pprint
response = gdbmiparser.parse_response('^done,bkpt={number="1",type="breakpoint",disp="keep", enabled="y",addr="0x08048564",func="main",file="myprog.c",fullname="/home/myprog.c",line="68",thread-groups=["i1"],times="0"')
pprint(response)
pprint(response)
# Prints:
# {'message': 'done',
#  'payload': {'bkpt': {'addr': '0x08048564',
#                       'disp': 'keep',
#                       'enabled': 'y',
#                       'file': 'myprog.c',
#                       'fullname': '/home/myprog.c',
#                       'func': 'main',
#                       'line': '68',
#                       'number': '1',
#                       'thread-groups': ['i1'],
#                       'times': '0',
#                       'type': 'breakpoint'}},
#  'token': None,
#  'type': 'result'}
```

## Programmatic Control Over gdb

But how do you get the gdb output into Python in the first place? If you want, `pygdbmi` also has a class to control gdb as subprocess. You can write commands, and get structured output back:

```python
from pygdbmi.gdbcontroller import GdbController
from pprint import pprint

# Start gdb process
gdbmi = GdbController()
print(gdbmi.command)  # print actual command run as subprocess
# Load binary a.out and get structured response
response = gdbmi.write('-file-exec-file a.out')
pprint(response)
# Prints:
# [{'message': 'thread-group-added',
#   'payload': {'id': 'i1'},
#   'stream': 'stdout',
#   'token': None,
#   'type': 'notify'},
#  {'message': 'done',
#   'payload': None,
#   'stream': 'stdout',
#   'token': None,
#   'type': 'result'}]
```

Now do whatever you want with gdb. All gdb commands, as well as gdb [machine interface commands](<(https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Input-Syntax.html#GDB_002fMI-Input-Syntax)>) are acceptable. gdb mi commands give better structured output that is machine readable, rather than gdb console output. mi commands begin with a `-`.

```python
response = gdbmi.write('-break-insert main')  # machine interface (MI) commands start with a '-'
response = gdbmi.write('break main')  # normal gdb commands work too, but the return value is slightly different
response = gdbmi.write('-exec-run')
response = gdbmi.write('run')
response = gdbmi.write('-exec-next', timeout_sec=0.1)  # the wait time can be modified from the default of 1 second
response = gdbmi.write('next')
response = gdbmi.write('next', raise_error_on_timeout=False)
response = gdbmi.write('next', raise_error_on_timeout=True, timeout_sec=0.01)
response = gdbmi.write('-exec-continue')
response = gdbmi.send_signal_to_gdb('SIGKILL')  # name of signal is okay
response = gdbmi.send_signal_to_gdb(2)  # value of signal is okay too
response = gdbmi.interrupt_gdb()  # sends SIGINT to gdb
response = gdbmi.write('continue')
response = gdbmi.exit()
```

## Parsed Output Format

Each parsed gdb response consists of a list of dictionaries. Each dictionary has keys `message`, `payload`, `token`, and `type`.

- `message` contains a textual message from gdb, which is not always present. When missing, this is `None`.
- `payload` contains the content of gdb's output, which can contain any of the following: `dictionary`, `list`, `string`. This too is not always present, and can be `None` depending on the response.
- `token` If an input command was prefixed with a (optional) token then the corresponding output for that command will also be prefixed by that same token. This field is only present for pygdbmi output types `nofity` and `result`. When missing, this is `None`.

The `type` is defined based on gdb's various [mi output record types](<(https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Output-Records.html#GDB_002fMI-Output-Records)>), and can be

- `result` - the result of a gdb command, such as `done`, `running`, `error`, etc.
- `notify` - additional async changes that have occurred, such as breakpoint modified
- `console` - textual responses to cli commands
- `log` - debugging messages from gdb's internals
- `output` - output from target
- `target` - output from remote target
- `done` - when gdb has finished its output

## Contributing

Documentation fixes, bug fixes, performance improvements, and functional improvements are welcome. You may want to create an issue before beginning work to make sure I am interested in merging it to the master branch.

pygdbmi uses [nox](https://github.com/theacodes/nox) for automation.

See available tasks with

```
nox -l
```

Run tests and lint with

```
nox -s tests
nox -s lint
```

Positional arguments passed to `nox -s tests` are passed directly to `pytest`. For instance, to run only the parse tests use

```
nox -s tests -- tests/test_gdbmiparser.py
```

See [`pytest`'s documentation](https://docs.pytest.org/) for more details on how to run tests.

To format code using the correct settings use

```
nox -s format
```

Or, to format only specified files, use

```
nox -s format -- example.py pygdbmi/IoManager.py
```

### Making a release

Only maintainers of the [pygdbmi package on PyPi](https://pypi.org/project/pygdbmi/) can make a release.

In the following steps, replace these strings with the correct values:

- `<REMOTE>` is the name of the remote for the main pygdbmi repository (for instance, `origin`)
- `<VERSION>` is the version number chosen in step 2.

To make a release:

1. Checkout the `master` branch and pull from the main repository with `git pull <REMOTE> master`
2. Decide the version number for the new release; we follow
   [Semantic Versioning](https://semver.org/) but prefixing the version with `0.`: given a version
   number _0.SECOND.THIRD.FOURTH_, increment the:
   - _SECOND_ component when you make incompatible API changes
   - _THIRD_ component when you add functionality in a backwards compatible manner
   - _FOURTH_ component when you make backwards compatible bug fixes
3. Update `CHANGELOG.md` to list the chosen version number instead of `## dev`
4. Update `__version__` in `pygdbmi/__init__.py` to the chosen version number
5. Create a branch, for instance using `git checkout -b before-release-<VERSION>`
6. Commit your changes, for instance using `git commit -a -m 'Bump version to <VERSION> for release'`
7. Check that the docs look fine by serving them locally with `nox -s serve_docs`
8. Push the branch, for instance with `git push --set-upstream <REMOTE> before-release-<VERSION>`
9. If tests pass on the PR you created, you can merge into `master`
10. Go to the [new release page](https://github.com/cs01/pygdbmi/releases/new) and prepare the
    release:
    - Add a tag in the form `v<VERSION>` (for example `v0.1.2.3`)
    - Set the title to `pygdbmi v<VERSION>` (for example `pygdbmi v0.1.2.3`)
    - Copy and paste the section for the new release only from `CHANGELOG.md` excluding the line
      with the version number
    - Press “Publish release”
10. Publish the release to PyPI with `nox -s publish`
11. Publish the docs with `nox -s publish_docs`
11. Verify that the [PyPi page for pygdbmi](https://pypi.org/project/pygdbmi/) looks correct
12. Verify that the [published docs](https://cs01.github.io/pygdbmi/) look correct
13. Prepare for changes for the next release by adding something like this above the previous
    entries in `CHANGELOG.md` (where `<VERSION+1>` is `<VERSION>` with the last digit increaded
    by 1):

    ```
    ## <VERSION+1>.dev0

    - *Replace this line with new entries*
    ```

14. Create a branch for the changes with `git checkout -b after-release-<VERSION>`
15. Commit the change with `git commit -m 'Prepare for work on the next release' CHANGELOG.md`
16. Push the branch with `git push --set-upstream <REMOTE> after-release-<VERSION>`
17. If tests pass, merge into `master`

## Similar projects

- [tsgdbmi](https://github.com/Guyutongxue/tsgdbmi) A port of pygdbmi to TypeScript
- [danielzfranklin/gdbmi](https://github.com/danielzfranklin/gdbmi) A port of pygdbmi to Rust

## Projects Using pygdbmi

- [gdbgui](https://github.com/cs01/gdbgui) implements a browser-based frontend to gdb, using pygdbmi on the backend
- [PINCE](https://github.com/korcankaraokcu/PINCE) is a gdb frontend that aims to provide a reverse engineering tool and a reusable library focused on games. It uses pygdbmi to parse gdb/mi based output for some functions
- [avatar²](https://github.com/avatartwo/avatar2) is an orchestration framework for reversing and analysing firmware of embedded devices. It utilizes pygdbmi for internal communication to different analysis targets.
- [UDB](https://undo.io/udb) is a proprietary time-travel debugger for C and C++ based on GDB. It uses pygdbmi in its extensive test suite to parse the debugger's output.
- Know of another project? Create a PR and add it here.

## Authors

- [Chad Smith](https://github.com/cs01) (main author and creator).
- [Marco Barisione](http://www.barisione.org/) (co-maintainer).
- [The community](https://github.com/cs01/pygdbmi/graphs/contributors). Thanks especially to @mariusmue, @bobthekingofegypt, @mouuff, and @felipesere.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/cs01/pygdbmi",
    "name": "pygdbmi",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "gdb,python,machine-interface,parse,frontend",
    "author": "Chad Smith",
    "author_email": "grassfedcode@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/2a/d0/d386ad42b12b90e60293c56a3b793910f34aa21c63f7ddc8a857e498d458/pygdbmi-0.11.0.0.tar.gz",
    "platform": null,
    "description": "<h1 align=\"center\">\npygdbmi - Get Structured Output from GDB's Machine Interface\n</h1>\n\n<p align=\"center\">\n\n<a href=\"https://github.com/cs01/pygdbmi/actions\">\n<img src=\"https://github.com/cs01/pygdbmi/workflows/Tests/badge.svg?branch=master\" alt=\"Test status\" /></a>\n\n<a href=\"https://badge.fury.io/py/pygdbmi\">\n<img src=\"https://badge.fury.io/py/pygdbmi.svg\" alt=\"PyPI version\"/></a>\n\n</p>\n\n**Documentation** [https://cs01.github.io/pygdbmi](https://cs01.github.io/pygdbmi)\n\n**Source Code** [https://github.com/cs01/pygdbmi](https://github.com/cs01/pygdbmi)\n\n---\n\nPython (**py**) [**gdb**](https://www.gnu.org/software/gdb/) machine interface [(**mi**)](https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI.html)\n\n> GDB/MI is a line based machine oriented text interface to GDB and is activated by specifying using the --interpreter command line option (see Mode Options). It is specifically intended to support the development of systems which use the debugger as just one small component of a larger system.\n\n## What's in the box?\n\n1.  A function to parse gdb machine interface string output and return structured data types (Python dicts) that are JSON serializable. Useful for writing the backend to a gdb frontend. For example, [gdbgui](https://github.com/cs01/gdbgui) uses pygdbmi on the backend.\n2.  A Python class to control and interact with gdb as a subprocess\n\nTo get [machine interface](https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI.html) output from gdb, run gdb with the `--interpreter=mi2` flag like so:\n\n```\ngdb --interpreter=mi2\n```\n\n## Installation\n\n    pip install pygdbmi\n\n## Compatibility\n\n### Operating Systems\n\nCross platform support for Linux, macOS and Windows\n\n- Linux/Unix\n\n  Ubuntu 14.04 and 16.04 have been tested to work. Other versions likely work as well.\n\n- macOS\n\n  Note: the error `please check gdb is codesigned - see taskgated(8)` can be fixed by codesigning gdb with [these instructions](http://andresabino.com/2015/04/14/codesign-gdb-on-mac-os-x-yosemite-10-10-2/). If the error is not fixed, please [create an issue in github](https://github.com/cs01/pygdbmi/issues).\n\n- Windows\n\n  Windows 10 has been tested to work with MinGW and cygwin.\n\n### gdb versions\n\n- gdb 7.6+ has been tested. Older versions may work as well.\n\n## Examples\n\ngdb mi defines a syntax for its output that is suitable for machine readability and scripting: [example output](https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Simple-Examples.html#GDB_002fMI-Simple-Examples):\n\n```\n-> -break-insert main\n<- ^done,bkpt={number=\"1\",type=\"breakpoint\",disp=\"keep\",\nenabled=\"y\",addr=\"0x08048564\",func=\"main\",file=\"myprog.c\",\nfullname=\"/home/myprog.c\",line=\"68\",thread-groups=[\"i1\"],\ntimes=\"0\"}\n<- (gdb)\n```\n\nUse `pygdbmi.gdbmiparser.parse_response` to turn that string output into a JSON serializable dictionary\n\n```python\nfrom pygdbmi import gdbmiparser\nfrom pprint import pprint\nresponse = gdbmiparser.parse_response('^done,bkpt={number=\"1\",type=\"breakpoint\",disp=\"keep\", enabled=\"y\",addr=\"0x08048564\",func=\"main\",file=\"myprog.c\",fullname=\"/home/myprog.c\",line=\"68\",thread-groups=[\"i1\"],times=\"0\"')\npprint(response)\npprint(response)\n# Prints:\n# {'message': 'done',\n#  'payload': {'bkpt': {'addr': '0x08048564',\n#                       'disp': 'keep',\n#                       'enabled': 'y',\n#                       'file': 'myprog.c',\n#                       'fullname': '/home/myprog.c',\n#                       'func': 'main',\n#                       'line': '68',\n#                       'number': '1',\n#                       'thread-groups': ['i1'],\n#                       'times': '0',\n#                       'type': 'breakpoint'}},\n#  'token': None,\n#  'type': 'result'}\n```\n\n## Programmatic Control Over gdb\n\nBut how do you get the gdb output into Python in the first place? If you want, `pygdbmi` also has a class to control gdb as subprocess. You can write commands, and get structured output back:\n\n```python\nfrom pygdbmi.gdbcontroller import GdbController\nfrom pprint import pprint\n\n# Start gdb process\ngdbmi = GdbController()\nprint(gdbmi.command)  # print actual command run as subprocess\n# Load binary a.out and get structured response\nresponse = gdbmi.write('-file-exec-file a.out')\npprint(response)\n# Prints:\n# [{'message': 'thread-group-added',\n#   'payload': {'id': 'i1'},\n#   'stream': 'stdout',\n#   'token': None,\n#   'type': 'notify'},\n#  {'message': 'done',\n#   'payload': None,\n#   'stream': 'stdout',\n#   'token': None,\n#   'type': 'result'}]\n```\n\nNow do whatever you want with gdb. All gdb commands, as well as gdb [machine interface commands](<(https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Input-Syntax.html#GDB_002fMI-Input-Syntax)>) are acceptable. gdb mi commands give better structured output that is machine readable, rather than gdb console output. mi commands begin with a `-`.\n\n```python\nresponse = gdbmi.write('-break-insert main')  # machine interface (MI) commands start with a '-'\nresponse = gdbmi.write('break main')  # normal gdb commands work too, but the return value is slightly different\nresponse = gdbmi.write('-exec-run')\nresponse = gdbmi.write('run')\nresponse = gdbmi.write('-exec-next', timeout_sec=0.1)  # the wait time can be modified from the default of 1 second\nresponse = gdbmi.write('next')\nresponse = gdbmi.write('next', raise_error_on_timeout=False)\nresponse = gdbmi.write('next', raise_error_on_timeout=True, timeout_sec=0.01)\nresponse = gdbmi.write('-exec-continue')\nresponse = gdbmi.send_signal_to_gdb('SIGKILL')  # name of signal is okay\nresponse = gdbmi.send_signal_to_gdb(2)  # value of signal is okay too\nresponse = gdbmi.interrupt_gdb()  # sends SIGINT to gdb\nresponse = gdbmi.write('continue')\nresponse = gdbmi.exit()\n```\n\n## Parsed Output Format\n\nEach parsed gdb response consists of a list of dictionaries. Each dictionary has keys `message`, `payload`, `token`, and `type`.\n\n- `message` contains a textual message from gdb, which is not always present. When missing, this is `None`.\n- `payload` contains the content of gdb's output, which can contain any of the following: `dictionary`, `list`, `string`. This too is not always present, and can be `None` depending on the response.\n- `token` If an input command was prefixed with a (optional) token then the corresponding output for that command will also be prefixed by that same token. This field is only present for pygdbmi output types `nofity` and `result`. When missing, this is `None`.\n\nThe `type` is defined based on gdb's various [mi output record types](<(https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Output-Records.html#GDB_002fMI-Output-Records)>), and can be\n\n- `result` - the result of a gdb command, such as `done`, `running`, `error`, etc.\n- `notify` - additional async changes that have occurred, such as breakpoint modified\n- `console` - textual responses to cli commands\n- `log` - debugging messages from gdb's internals\n- `output` - output from target\n- `target` - output from remote target\n- `done` - when gdb has finished its output\n\n## Contributing\n\nDocumentation fixes, bug fixes, performance improvements, and functional improvements are welcome. You may want to create an issue before beginning work to make sure I am interested in merging it to the master branch.\n\npygdbmi uses [nox](https://github.com/theacodes/nox) for automation.\n\nSee available tasks with\n\n```\nnox -l\n```\n\nRun tests and lint with\n\n```\nnox -s tests\nnox -s lint\n```\n\nPositional arguments passed to `nox -s tests` are passed directly to `pytest`. For instance, to run only the parse tests use\n\n```\nnox -s tests -- tests/test_gdbmiparser.py\n```\n\nSee [`pytest`'s documentation](https://docs.pytest.org/) for more details on how to run tests.\n\nTo format code using the correct settings use\n\n```\nnox -s format\n```\n\nOr, to format only specified files, use\n\n```\nnox -s format -- example.py pygdbmi/IoManager.py\n```\n\n### Making a release\n\nOnly maintainers of the [pygdbmi package on PyPi](https://pypi.org/project/pygdbmi/) can make a release.\n\nIn the following steps, replace these strings with the correct values:\n\n- `<REMOTE>` is the name of the remote for the main pygdbmi repository (for instance, `origin`)\n- `<VERSION>` is the version number chosen in step 2.\n\nTo make a release:\n\n1. Checkout the `master` branch and pull from the main repository with `git pull <REMOTE> master`\n2. Decide the version number for the new release; we follow\n   [Semantic Versioning](https://semver.org/) but prefixing the version with `0.`: given a version\n   number _0.SECOND.THIRD.FOURTH_, increment the:\n   - _SECOND_ component when you make incompatible API changes\n   - _THIRD_ component when you add functionality in a backwards compatible manner\n   - _FOURTH_ component when you make backwards compatible bug fixes\n3. Update `CHANGELOG.md` to list the chosen version number instead of `## dev`\n4. Update `__version__` in `pygdbmi/__init__.py` to the chosen version number\n5. Create a branch, for instance using `git checkout -b before-release-<VERSION>`\n6. Commit your changes, for instance using `git commit -a -m 'Bump version to <VERSION> for release'`\n7. Check that the docs look fine by serving them locally with `nox -s serve_docs`\n8. Push the branch, for instance with `git push --set-upstream <REMOTE> before-release-<VERSION>`\n9. If tests pass on the PR you created, you can merge into `master`\n10. Go to the [new release page](https://github.com/cs01/pygdbmi/releases/new) and prepare the\n    release:\n    - Add a tag in the form `v<VERSION>` (for example `v0.1.2.3`)\n    - Set the title to `pygdbmi v<VERSION>` (for example `pygdbmi v0.1.2.3`)\n    - Copy and paste the section for the new release only from `CHANGELOG.md` excluding the line\n      with the version number\n    - Press \u201cPublish release\u201d\n10. Publish the release to PyPI with `nox -s publish`\n11. Publish the docs with `nox -s publish_docs`\n11. Verify that the [PyPi page for pygdbmi](https://pypi.org/project/pygdbmi/) looks correct\n12. Verify that the [published docs](https://cs01.github.io/pygdbmi/) look correct\n13. Prepare for changes for the next release by adding something like this above the previous\n    entries in `CHANGELOG.md` (where `<VERSION+1>` is `<VERSION>` with the last digit increaded\n    by 1):\n\n    ```\n    ## <VERSION+1>.dev0\n\n    - *Replace this line with new entries*\n    ```\n\n14. Create a branch for the changes with `git checkout -b after-release-<VERSION>`\n15. Commit the change with `git commit -m 'Prepare for work on the next release' CHANGELOG.md`\n16. Push the branch with `git push --set-upstream <REMOTE> after-release-<VERSION>`\n17. If tests pass, merge into `master`\n\n## Similar projects\n\n- [tsgdbmi](https://github.com/Guyutongxue/tsgdbmi) A port of pygdbmi to TypeScript\n- [danielzfranklin/gdbmi](https://github.com/danielzfranklin/gdbmi) A port of pygdbmi to Rust\n\n## Projects Using pygdbmi\n\n- [gdbgui](https://github.com/cs01/gdbgui) implements a browser-based frontend to gdb, using pygdbmi on the backend\n- [PINCE](https://github.com/korcankaraokcu/PINCE) is a gdb frontend that aims to provide a reverse engineering tool and a reusable library focused on games. It uses pygdbmi to parse gdb/mi based output for some functions\n- [avatar\u00b2](https://github.com/avatartwo/avatar2) is an orchestration framework for reversing and analysing firmware of embedded devices. It utilizes pygdbmi for internal communication to different analysis targets.\n- [UDB](https://undo.io/udb) is a proprietary time-travel debugger for C and C++ based on GDB. It uses pygdbmi in its extensive test suite to parse the debugger's output.\n- Know of another project? Create a PR and add it here.\n\n## Authors\n\n- [Chad Smith](https://github.com/cs01) (main author and creator).\n- [Marco Barisione](http://www.barisione.org/) (co-maintainer).\n- [The community](https://github.com/cs01/pygdbmi/graphs/contributors). Thanks especially to @mariusmue, @bobthekingofegypt, @mouuff, and @felipesere.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Parse gdb machine interface output with Python",
    "version": "0.11.0.0",
    "split_keywords": [
        "gdb",
        "python",
        "machine-interface",
        "parse",
        "frontend"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c84b71df806f4d260ddf01f9e431f5a6538a4155db3ec84a131d7e087178c591",
                "md5": "0a5498c350a961b95aab4b65ebbf5ed3",
                "sha256": "f7cac28e1d558927444c880ed1e65da1a5d8686121a3aac16f42fb84d3ceb60d"
            },
            "downloads": -1,
            "filename": "pygdbmi-0.11.0.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "0a5498c350a961b95aab4b65ebbf5ed3",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 21258,
            "upload_time": "2023-01-29T16:10:53",
            "upload_time_iso_8601": "2023-01-29T16:10:53.171463Z",
            "url": "https://files.pythonhosted.org/packages/c8/4b/71df806f4d260ddf01f9e431f5a6538a4155db3ec84a131d7e087178c591/pygdbmi-0.11.0.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2ad0d386ad42b12b90e60293c56a3b793910f34aa21c63f7ddc8a857e498d458",
                "md5": "34b1812e77469c6206002b3929798cab",
                "sha256": "7a286be2fcf25650d9f66e11adc46e972cf078a466864a700cd44739ad261fb0"
            },
            "downloads": -1,
            "filename": "pygdbmi-0.11.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "34b1812e77469c6206002b3929798cab",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 24648,
            "upload_time": "2023-01-29T16:10:55",
            "upload_time_iso_8601": "2023-01-29T16:10:55.650147Z",
            "url": "https://files.pythonhosted.org/packages/2a/d0/d386ad42b12b90e60293c56a3b793910f34aa21c63f7ddc8a857e498d458/pygdbmi-0.11.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-01-29 16:10:55",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "cs01",
    "github_project": "pygdbmi",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pygdbmi"
}
        
Elapsed time: 0.03477s