demo.mov
GEP
(GDB Enhanced Prompt) is a GDB plug-in which make your GDB command prompt more convenient and flexibility.
GDB's original prompt is using hardcoded built-in GNU readline library, we can't add our custom function and key binding easily. The old way to implement them is by patching the GDB's C source code and compiling it again.
But now, you can write your function in Python and use arbitrary key binding easily with GEP without any patching!
And also, GEP has some awesome features already, you can directly use it!
- Ctrl+r for fzf history reverse search
- ↑ key for partial string matching in history
- TAB for auto-completion with:
- fzf (When fzf is installed)
- floating window (Similar to IPython's auto-completion)
- fish-like autosuggestions (→ key to accept the suggestion)
- has the ability to build custom key binding and its callback function by modifying
geprc.py
Make sure you have GDB 8.0 or higher compiled with Python3.7+ bindings, then:
- Install git and curl (or wget)
- Make sure you have virtualenv installed
- Install fzf: Installation (Optional, but GEP works better with fzf)
- Install this plug-in by:
# via the install script
## using curl
$ bash -c "$(curl -fsSL https://raw.githubusercontent.com/lebr0nli/GEP/main/install.sh)"
## using wget
$ bash -c "$(wget https://raw.githubusercontent.com/lebr0nli/GEP/main/install.sh -O -)"
- Enjoy!
You can re-run the install script to update the version of GEP.
You can modify the configuration for history, auto-completion, and other GEP configurations in /path/to/GEP/gdbinit-gep
.
You can also add your custom key bindings by modifying /path/to/GEP/geprc.py
.
Since GDB doesn't have a good Python API to fully control and emulate its prompt, this plug-in has some side effects.
However, the side effects are avoidable, here are the guides to avoid them:
Somehow, GEP breaks the TUI mode in GDB, so it's advisable not to use GDB's built-in TUI when working with GEP (refer to issue #13).
Alternatively, I personally recommend trying pwndbg/pwndbg or hugsy/gef for their user-friendly features.
If you have any ideas to resolve this issue, PRs are greatly appreciated. 🙏
The GDB Python API event: gdb.event.before_prompt
may be called only once.
So if you are using a GDB plug-in that is listening on this event, this plug-in will cause some bugs.
Note As far as I know, pwndbg and gef won't be bothered by this side effect now.
To avoid this, you can change the callback function by adding them to gdb.prompt_hook
, gdb.prompt_hook
has almost
the same effects with event.before_prompt
, but gdb.prompt_hook
can be directed invoke, so this plug-in still can
emulate that callback for you!
When your input is empty and directly press ENTER, GDB will execute the previous command from history if that command
doesn't have the property: dont-repeat
.
As far as I know, there is no GDB API for checking a command's property.
So, I added some commonly used commands (for original GDB API and GEF) which have that property in a set to avoid repeatedly executing them.
If you have some user-defined function that has dont-repeat
property, add your command into the set manually, too.
Note The set of those user-defined commands are in
geprc.py
and the variable name for it isDONT_REPEAT
.If you found some builtin commands which should or shouldn't be added by default, let me know on the issue page, thanks!
Some ideas/code are inspired by hugsy/gef and pwndbg/pwndbg.
Thanks!
If you found any bug, or you have any suggestions/ideas about this plug-in, feel free to leave your feedback on the GitHub issue page or send me a pull request!
Thanks!