Skip to content
/ GEP Public

GEP (GDB Enhanced Prompt) - a GDB plug-in to enhance your GDB with fzf history search, fish-like autosuggestions, tab auto-completion with fzf, and more!

License

Notifications You must be signed in to change notification settings

lebr0nli/GEP

Repository files navigation

GEP (GDB Enhanced Prompt)

demo.mov

GEP(GDB Enhanced Prompt) is a GDB plug-in which make your GDB command prompt more convenient and flexibility.

Why I need this plug-in?

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!

Features

  • Ctrl+rforfzfhistory reverse search
  • key for partial string matching in history
  • TABfor 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 modifyinggeprc.py
  • compatible with the latest version of your favorite GDB plug-ins:

How to install it?

Make sure you have GDB 8.0+ (ideally GDB 14.1+ for the best experience) and compiled with Python3.8+ bindings, then:

  1. Install git
  2. Make sure you havevirtualenvinstalled
  3. Install fzf:Installation(Optional, but GEP works better with fzf)
  4. Install this plug-in by:
#You could also choose other directories to install GEP if you want
git clone --depth 1 https://github /lebr0nli/GEP.git~/.local/share/GEP
~/.local/share/GEP/install.sh
  1. Enjoy!

Important

After the installation, the script will automatically addsource /path/to/GEP/gdbinit-gep.pyto your~/.gdbinitfile. Please make sure this line isalwaysat the end of your~/.gdbinitfile during future modifications of your~/.gdbinitto avoid some unexpected behaviors.

How to update the version of GEP?

If your~/.gdbinitis something like this:source ~/.local/share/GEP/gdbinit-gep.py,then you can update GEP by:

cd~/.local/share/GEP&&git pull&&./install.sh

For more configuration

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.

Note

Theexamplesubdirectory houses samples and default configurations.

The trade-offs

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:

TUI mode

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).

Instead of using gdb TUI, I personally recommend tryingpwndbg/pwndbg,hugsy/gefandcyrus-and/gdb-dashboardto enhance your debugging experience.

If you have any ideas to resolve this issue, PRs are greatly appreciated. 🙏

gdb.event.before_prompt

The GDB Python API event:gdb.event.before_promptmay 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

pwndbg, gef, and gdb-dashboard won't be affected by this side effect so far, but please open an issue if you find any plug-in that is affected by this side effect.

To avoid this, you can change the callback function by adding them togdb.prompt_hook,gdb.prompt_hookhas almost the same effects withevent.before_prompt,butgdb.prompt_hookcan be directed invoke, so this plug-in still can emulate that callback for you!

dont-repeat

When your input is empty and directly pressENTER,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 hasdont-repeatproperty, add your command into the set manually, too.

Note

The set of those user-defined commands are ingeprc.pyand 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!

Uninstall

If this is your current~/.gdbinitfile after the installation:

source/path/to/GEP/gdbinit-gep.py

Then, you can uninstall this plug-in by:

rm -rf /path/to/GEP

And removesource /path/to/GEP/gdbinit-gep.pyfrom your~/.gdbinit.

Credits

Some ideas/code are inspired byhugsy/gefandpwndbg/pwndbg.

Thanks!

Bugs, suggestions, and ideas

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!