You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pwndbg/pwndbginit/gdbpatches.py

53 lines
1.6 KiB
Python

from __future__ import annotations
import importlib.abc
import os
import sys
import traceback
import gdb
def fix_exit():
major_ver = int(gdb.VERSION.split(".")[0])
if major_ver <= 15:
# On certain verions of gdb (used on ubuntu 24.04) using sys.exit() can cause
# a segfault. See:
# https://github.com/pwndbg/pwndbg/pull/2900#issuecomment-2825456636
# https://sourceware.org/bugzilla/show_bug.cgi?id=31946
def _patched_exit(exit_code):
# argparse requires a SystemExit exception, otherwise our CLI commands will exit incorrectly on invalid arguments
stack_list = traceback.extract_stack(limit=2)
if len(stack_list) == 2:
p = stack_list[0]
if p.filename.endswith("/argparse.py"):
raise SystemExit()
sys.stdout.flush()
sys.stderr.flush()
os._exit(exit_code)
sys.exit = _patched_exit
def fix_stdout():
# Add the original stdout methods back to gdb._GdbOutputFile for pwnlib colors
sys.stdout.isatty = sys.__stdout__.isatty
sys.stdout.fileno = sys.__stdout__.fileno
def fix_readline():
# Fix gdb readline bug: https://github.com/pwndbg/pwndbg/issues/2232#issuecomment-2542564965
class GdbRemoveReadlineFinder(importlib.abc.MetaPathFinder):
def find_spec(self, fullname, path=None, target=None):
if fullname == "readline":
raise ImportError("readline module disabled under GDB")
return None
sys.meta_path.insert(0, GdbRemoveReadlineFinder())
fix_stdout()
fix_readline()
fix_exit()