mirror of https://github.com/pwndbg/pwndbg.git
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.
91 lines
2.5 KiB
Python
91 lines
2.5 KiB
Python
from __future__ import annotations
|
|
|
|
import cProfile
|
|
import logging
|
|
import os
|
|
import sys
|
|
import time
|
|
import traceback
|
|
|
|
import gdb
|
|
|
|
from pwndbginit import gdbpatches # noqa: F401
|
|
from pwndbginit.common import verify_venv
|
|
|
|
|
|
def init_logger():
|
|
log_level_env = os.environ.get("PWNDBG_LOGLEVEL", "WARNING")
|
|
log_level = getattr(logging, log_level_env.upper())
|
|
|
|
root_logger = logging.getLogger()
|
|
root_logger.setLevel(log_level)
|
|
|
|
# Add a custom StreamHandler we will use to customize log message formatting. We
|
|
# configure the handler later, after pwndbg has been imported.
|
|
handler = logging.StreamHandler()
|
|
root_logger.addHandler(handler)
|
|
|
|
return handler
|
|
|
|
|
|
def check_doubleload():
|
|
if "pwndbg" in sys.modules:
|
|
print(
|
|
"Detected double-loading of Pwndbg (likely from both .gdbinit and the Pwndbg portable build)."
|
|
)
|
|
print(
|
|
"To fix this, please remove the line 'source your-path/gdbinit.py' from your .gdbinit file."
|
|
)
|
|
sys.exit(1)
|
|
|
|
|
|
def main() -> None:
|
|
handler = init_logger()
|
|
profiler = cProfile.Profile()
|
|
|
|
start_time = None
|
|
if os.environ.get("PWNDBG_PROFILE") == "1":
|
|
start_time = time.time()
|
|
profiler.enable()
|
|
|
|
check_doubleload()
|
|
verify_venv()
|
|
|
|
# Force UTF-8 encoding (to_string=True to skip output appearing to the user)
|
|
try:
|
|
gdb.execute("set target-wide-charset UTF-8", to_string=True)
|
|
gdb.execute("set charset UTF-8", to_string=True)
|
|
except gdb.error as e:
|
|
print(f"Warning: Cannot set gdb charset: '{e}'")
|
|
|
|
import pwndbg # noqa: F811
|
|
import pwndbg.dbg.gdb
|
|
|
|
pwndbg.dbg = pwndbg.dbg_mod.gdb.GDB()
|
|
pwndbg.dbg.setup()
|
|
|
|
import pwndbg.log
|
|
import pwndbg.profiling
|
|
|
|
# ColorFormatter relies on pwndbg being loaded, so we can't set it up until now
|
|
handler.setFormatter(pwndbg.log.ColorFormatter())
|
|
|
|
pwndbg.profiling.init(profiler, start_time)
|
|
if os.environ.get("PWNDBG_PROFILE") == "1":
|
|
pwndbg.profiling.profiler.stop("pwndbg-load.pstats")
|
|
pwndbg.profiling.profiler.start()
|
|
|
|
# We need reimport it here so that it's available at the global scope
|
|
# when some starts a Python interpreter in GDB
|
|
gdb.execute("py import pwndbg")
|
|
|
|
|
|
def main_try():
|
|
# We wrap everything in try/except so that we can exit GDB with an error code
|
|
# This is used by tests to check if gdbinit.py failed
|
|
try:
|
|
main()
|
|
except Exception:
|
|
print(traceback.format_exc(), file=sys.stderr, flush=True)
|
|
os._exit(1)
|