{"id":35182570,"url":"https://github.com/openimagedebugger/openimagedebugger","last_synced_at":"2026-04-08T08:01:05.208Z","repository":{"id":40792921,"uuid":"205714671","full_name":"OpenImageDebugger/OpenImageDebugger","owner":"OpenImageDebugger","description":"An advanced in-memory image visualization plugin for GDB and LLDB on Linux, with experimental support for MacOS and Windows. Previously known as gdb-imagewatch.","archived":false,"fork":false,"pushed_at":"2026-04-02T05:04:15.000Z","size":2936,"stargazers_count":246,"open_issues_count":35,"forks_count":48,"subscribers_count":4,"default_branch":"main","last_synced_at":"2026-04-03T00:39:16.798Z","etag":null,"topics":["cpp","debugger","debugger-extension","debugger-visualizer","eigen","gdb","image","imagewatch","linux","lldb","macos","opencv","plugin","python","qt","visualization","windows"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OpenImageDebugger.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"ko_fi":"openimagedebugger"}},"created_at":"2019-09-01T18:12:57.000Z","updated_at":"2026-04-02T05:03:59.000Z","dependencies_parsed_at":"2026-04-02T12:07:24.523Z","dependency_job_id":null,"html_url":"https://github.com/OpenImageDebugger/OpenImageDebugger","commit_stats":null,"previous_names":[],"tags_count":434,"template":false,"template_full_name":null,"purl":"pkg:github/OpenImageDebugger/OpenImageDebugger","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenImageDebugger%2FOpenImageDebugger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenImageDebugger%2FOpenImageDebugger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenImageDebugger%2FOpenImageDebugger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenImageDebugger%2FOpenImageDebugger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OpenImageDebugger","download_url":"https://codeload.github.com/OpenImageDebugger/OpenImageDebugger/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenImageDebugger%2FOpenImageDebugger/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31545906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"online","status_checked_at":"2026-04-08T02:00:06.127Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","debugger","debugger-extension","debugger-visualizer","eigen","gdb","image","imagewatch","linux","lldb","macos","opencv","plugin","python","qt","visualization","windows"],"created_at":"2025-12-29T03:27:06.777Z","updated_at":"2026-04-08T08:01:05.191Z","avatar_url":"https://github.com/OpenImageDebugger.png","language":"C++","readme":"# Open Image Debugger: Enabling visualization of in-memory buffers on GDB/LLDB\n\nOpen Image Debugger is a tool for visualizing in-memory buffers during debug\nsessions, compatible with both GDB and LLDB. It works out of the box with\ninstances of the OpenCV `Mat` class and `Eigen` matrices, but can also be\ncustomized to work with any arbitrary data structure.\n\n![Sample window](doc/sample_window.png)\n\n# Download (experimental) [![OID Eternal Download Count](https://img.shields.io/github/downloads/openimagedebugger/openimagedebugger/total.svg)](https://tooomm.github.io/github-release-stats/?username=OpenImageDebugger\u0026repository=OpenImageDebugger\u0026search=0)\n## A bit experimental, better to compile manually\n\n## Features\n\n* GUI interactivity:\n  * Scroll to zoom, left click+drag to move the buffer around;\n  * Rotate buffers 90\u0026deg; clockwise or counterclockwise;\n  * Go-to widget that quickly takes you to any arbitrary pixel location;\n* Buffer values: Zoom in close enough to inspect the numerical contents of any pixel.\n* Auto update: Whenever a breakpoint is hit, the buffer view is automatically\n  updated.\n* Auto contrast: The entire range of values present in the buffer can be\n  automatically mapped to the visualization range `[0, 1]`, where `0`\n  represents black and `1` represents white.\n* The contrast range can be manually adjusted, which is useful for inspecting\n  buffers with extreme values (e.g. infinity, nan and other outliers).\n* Link views together, moving all watched buffers simultaneously when any\n  single buffer is moved on the screen\n* Supported buffer types: uint8_t, int16_t, uint16_t, int32_t, uint32_t,\n  float and double\n* Supported buffer channels: Up to four channels (Grayscale, two-channels, RGB\n  and RGBA)\n* GPU accelerated\n* Supports large buffers whose dimensions exceed GL_MAX_TEXTURE_SIZE.\n* Supports data structures that map to a ROI of a larger buffer.\n* Exports buffers as png images (with auto contrast) or octave/matlab matrix\n  files (unprocessed).\n* Auto-load buffers being visualized in the previous debug session\n* Designed to scale well for HighDPI displays\n* Works on Linux, macOS X and Windows (experimental)\n\n## Supported OSes\n\n* OID is developed with Ubuntu as the main target. The goal is to support the two latest LTS versions at a given time.\n  * Ubuntu is also used as a basis for the minimum versions of the dependencies: we try to support the default versions of the packages you get via `apt install`\n* There are currently no plans to support other Linux distros. OID may or may not compile on your favorite distro, your mileage may vary.\n* Support for MacOS and Windows are somewhat experimental now - the code should be able to compile (see \u003chttps://github.com/OpenImageDebugger/OpenImageDebugger/releases\u003e), but the binaries are not actively tested - in fact we currently have no automated tests at all for any OS - help is more than welcome in this regard. Also, we haven't come up with a simple installation/usage guides for these OSes yet.\n\n## Requirements\n\n* A C++20 compliant compiler\n* GDB **12.1+** or LLDB **14.0.0+**\n* Qt **6.2.4+**\n* CMake **3.22.1+**\n* Python **3.10.12+** development packages\n* OpenGL **2.1+** support\n\nNote: this list might get out-of-date by accident. For a more accurate list of requirements, please check what is used in \u003chttps://github.com/OpenImageDebugger/OpenImageDebugger/blob/main/.github/workflows/build.yml\u003e.\n\n## Installation\n\n### Ubuntu Linux dependencies\n\nOn Ubuntu, you can install most of the dependencies with the following command:\n\n```bash\nsudo apt install build-essential libgl1-mesa-dev libpython3-dev python3-dev cmake qt6-base-dev\n```\n\n### Building the Open Image Debugger\n\nClone the source code to any folder you prefer and initialize the\nsubmodules:\n\n```bash\ngit clone https://github.com/OpenImageDebugger/OpenImageDebugger.git --recurse-submodules\n```\n\nNow run the following commands to build it:\n\n```bash\ncmake -S . -B build -DCMAKE_INSTALL_PREFIX=/path/to/installation/folder\ncmake --build build --config Release --target install -j 4\n```\n\n**GDB integration:** Edit the file `~/.gdbinit` (create it if it doesn't exist)\nand append the following line:\n\n```bash\nsource /path/to/OpenImageDebugger/oid.py\n```\n\n**LLDB integration:** Edit the file `~/.lldbinit` (create it if it doesn't\nexist) and append the following line:\n\n```bash\ncommand script import /path/to/OpenImageDebugger/oid.py\n```\n\n### MacOS Installation\n\nFor information on how to build the plugin on MacOS, refer to the wiki page\n[Building on\nMacOS](https://github.com/OpenImageDebugger/OpenImageDebugger/wiki/Building-on-MacOS).\n\n### Testing your installation\n\nAfter compiling the plugin, you can test it by running the following command:\n\n```bash\npython /path/to/OpenImageDebugger/oid.py --test\n```\n\nIf the installation was succesful, you should see the Open Image Debugger window\nwith the buffers `sample_buffer_1` and `sample_buffer_2`.\n\n## Troubleshooting\n\n### QtCreator configuration\n\nIf you are using QtCreator, you can change your Qt version under\nTools-\u003eOptions-\u003eBuild \u0026 Run-\u003eKits. Make sure you have Qt \u003e= 5.6 selected.\n\n## Using plugin\n\nWhen the debugger hits a breakpoint, the Open Image Debugger window will be\nopened. You only need to type the name of the buffer to be watched in the\n\"add symbols\" input, and press `\u003center\u003e`.\n\n### \u003cimg src=\"doc/auto-contrast.svg\" width=\"20\"/\u003e Auto-contrast and manual contrast\n\nThe (min) and (max) fields on top of the buffer view can be changed to control\nautocontrast settings. By default, Open Image Debugger will automatically fill these\nfields with the mininum and maximum values inside the entire buffer, and the\nchannel values will be normalized from these values to the range [0, 1] inside\nthe renderer.\n\nSometimes, your buffer may contain trash, uninitialized values that are either\ntoo large or too small, making the entire image look flat because of this\nnormalization. If you know the expected range for your image, you can manually\nchange the (min) and (max) values to focus on the range that you are\ninterested.\n\n### \u003cimg src=\"doc/link-views.svg\" width=\"20\"/\u003e Locking buffers\n\nSometimes you want to compare two buffers being visualized, and need to zoom in\ndifferent places of these buffers. If they are large enough, this can become a\nvery hard task, especially if you are comparing pixel values. This task is made\neasier by the `lock buffers` tool (which is toggled by the button with a chain\nicon).\n\nWhen it is activated, all buffers are moved/zoomed simultaneously by the same\namount. This means you only need to align the buffers being compared once;\nafter activating the `lock buffers` mode, you can zoom in anywhere you wish in\none buffer that all other buffers will be zoomed in the same location.\n\n### \u003cimg src=\"doc/location.svg\" width=\"20\"/\u003e Quickly moving to arbitrary coordinates\n\nIf you need to quickly move to any pixel location, then the *go to*\nfunctionality is what you are looking for. Press *Ctrl+L* and two input fields\ncorresponding to the target destination in format `\u003cx, y\u003e` will appear at the\nbottom right corner of the buffer screen. Type the desired location, then press\nenter to quickly zoom into that location.\n\n### Exporting bufers\n\nSometimes you may want to export your buffers to be able to process them in an\nexternal tool. In order to do that, right click the thumbnail corresponding to\nthe buffer you wish to export on the left pane and select \"export buffer\".\n\nOpen Image Debugger supports two export modes. You can save your buffer as a PNG\n(which may result in loss of data if your buffer type is not `uint8_t`) or as a\nbinary file that can be opened with any tool.\n\n### Loading exported buffers on Octave/Matlab\n\nBuffers exported in the `Octave matrix` format can be loaded with the function\n`oid_load.m`, which is available in the `matlab` folder. To use it, add this\nfolder to Octave/Matlab `path` variable and call\n`oid_load('/path/to/buffer.dump')`.\n\n## Basic configuration\n\nThe settings file for the plugin can be located under\n`$HOME/.config/OpenImageDebugger.ini`. You can change the following settings:\n\n* **Rendering**\n  * *maximum_framerate* Determines the maximum framerate for the buffer\n  rendering backend. Must be greater than 0.\n* **UI** - thanks to @a-hromov for the contribution\n  * *list_position* Determines the position of symbols list.\n    * `left` Default value.\n    * `right`\n    * `top`\n    * `bottom`\n  * *minmax_compact* Changes the position of min/max intensity controller.\n    * `true` Places min/max intensity controller in the same row with the toolbar.\n    * `false` Places min/max intensity controller below the toolbar. Default value.\n  * *colorspace* Selects the order of colorspace channels on the UI.\n    * `rgba` Default value.\n    * `bgra`\n\n## Advanced configuration\n\nBy default, the plugin works with several data types, including OpenCV's `Mat`\nand `CvMat` and Eigen's `Matrix`.\n\nIf you use a different buffer type, you can create a python parser inside the\nfolder `resources/oidscripts/oidtypes`. This is actually pretty simple and\nonly involves implementing a class according to the interface\n`TypeInspectorInterface` defined in\n`resources/oidscripts/oidtypes/interface.py`. This interface only defines the\nmethods `get_buffer_metadata()` and `is_symbol_observable()`.\n\nThe function `get_buffer_metadata()` must return a dictionary with the following\nfields:\n\n* **display_name** Name of the buffer as it must appear in the Open Image Debugger\n  window. Can be customized to also show its typename, for instance.\n* **pointer** Pointer to the buffer\n* **width**  Width of the ROI\n* **height** Height of the ROI\n* **channels** Number of color channels (Must be in the range `1 \u003c= channels\n   \u003c= 3`)\n* **type** Identifier for the type of the underlying buffer. The supported\n  values, defined under `resources/oidscripts/symbols.py`, are:\n  * `OID_TYPES_UINT8` = 0\n  * `OID_TYPES_UINT16` = 2\n  * `OID_TYPES_INT16` = 3\n  * `OID_TYPES_INT32` = 4\n  * `OID_TYPES_FLOAT32` = 5\n  * `OID_TYPES_FLOAT64` = 6\n* **row_stride** Number of pixels you have to skip in order to reach the pixel\n  right below any arbitrary pixel. In other words, this can be thought of as\n  the width, in pixels, of the underlying containing buffer. If the ROI is the\n  total buffer size, this is the same of the buffer width.\n* **pixel_layout** String describing how internal channels should be ordered\n  for display purposes. The default value for buffers of 3 and 4 channels is\n  `'bgra'`, and `'rgba'` for images of 1 and 2 channels. This string must\n  contain exactly four characters, and each one must be one of `'r'`, `'g'`,\n  `'b'` or `'a'`.  Repeated channels, such as 'rrgg' are also valid.\n* **transpose_buffer** Boolean indicating whether or not to transpose the\n  buffer in the interface. Can be very useful if your data structure represents\n  transposition with an internal metadata.\n\nThe function `is_symbol_observable()` receives a symbol and a string\ncontaining the variable name, and must only return `True` if that symbol is of\nthe observable type (the buffer you are dealing with).\n\nIt is possible to debug your custom inspector methods by using the python\ndecorators `@interface.debug_buffer_metadata` and\n`@interface.debug_symbol_observable` in the methods `get_buffer_metadata` and\n`is_symbol_observable`, respectively. This will print information about all\nanalyzed symbols in the debugger console every time a breakpoint is hit.\n","funding_links":["https://ko-fi.com/openimagedebugger"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenimagedebugger%2Fopenimagedebugger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenimagedebugger%2Fopenimagedebugger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenimagedebugger%2Fopenimagedebugger/lists"}