1*b40554a2SAndroid Build Coastguard Worker#!/bin/sh 2*b40554a2SAndroid Build Coastguard Worker 3*b40554a2SAndroid Build Coastguard Worker# Exit if anything fails 4*b40554a2SAndroid Build Coastguard Workerset -e 5*b40554a2SAndroid Build Coastguard Worker 6*b40554a2SAndroid Build Coastguard Workerif [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ] || [ "$1" = "--help" ]; then 7*b40554a2SAndroid Build Coastguard Worker echo " 8*b40554a2SAndroid Build Coastguard Workerrust-gdbgui 9*b40554a2SAndroid Build Coastguard Worker=========== 10*b40554a2SAndroid Build Coastguard Workergdbgui - https://gdbgui.com - is a graphical front-end to GDB 11*b40554a2SAndroid Build Coastguard Workerthat runs in a browser. This script invokes gdbgui with the Rust 12*b40554a2SAndroid Build Coastguard Workerpretty printers loaded. 13*b40554a2SAndroid Build Coastguard Worker 14*b40554a2SAndroid Build Coastguard WorkerSimple usage : rust-gdbgui target/debug/myprog 15*b40554a2SAndroid Build Coastguard WorkerWith arguments: rust-gdbgui 'target/debug/myprog arg1 arg2...' 16*b40554a2SAndroid Build Coastguard Worker (note the quotes) 17*b40554a2SAndroid Build Coastguard Worker 18*b40554a2SAndroid Build Coastguard Worker 19*b40554a2SAndroid Build Coastguard WorkerHints 20*b40554a2SAndroid Build Coastguard Worker===== 21*b40554a2SAndroid Build Coastguard Workergdbgui won't be able to find the rust 'main' method automatically, so 22*b40554a2SAndroid Build Coastguard Workerin its options make sure to disable the 'Add breakpoint to main after 23*b40554a2SAndroid Build Coastguard Workerloading executable' setting to avoid a 'File not found: main' warning 24*b40554a2SAndroid Build Coastguard Workeron startup. 25*b40554a2SAndroid Build Coastguard Worker 26*b40554a2SAndroid Build Coastguard WorkerInstead, type 'main' into gdbgui's file browser and you should get 27*b40554a2SAndroid Build Coastguard Workerauto-completion on the filename. Just pick 'main.rs', add a breakpoint 28*b40554a2SAndroid Build Coastguard Workerby clicking in the line number gutter, and type 'r' or hit the Restart 29*b40554a2SAndroid Build Coastguard Workericon to start your program running. 30*b40554a2SAndroid Build Coastguard Worker" 31*b40554a2SAndroid Build Coastguard Worker exit 0 32*b40554a2SAndroid Build Coastguard Workerfi 33*b40554a2SAndroid Build Coastguard Worker 34*b40554a2SAndroid Build Coastguard Worker# Prefer rustc in the same directory as this script 35*b40554a2SAndroid Build Coastguard WorkerDIR="$(dirname "$0")" 36*b40554a2SAndroid Build Coastguard Workerif [ -x "$DIR/rustc" ]; then 37*b40554a2SAndroid Build Coastguard Worker RUSTC="$DIR/rustc" 38*b40554a2SAndroid Build Coastguard Workerelse 39*b40554a2SAndroid Build Coastguard Worker RUSTC="rustc" 40*b40554a2SAndroid Build Coastguard Workerfi 41*b40554a2SAndroid Build Coastguard Worker 42*b40554a2SAndroid Build Coastguard Worker# Find out where the pretty printer Python module is 43*b40554a2SAndroid Build Coastguard WorkerRUSTC_SYSROOT="$("$RUSTC" --print=sysroot)" 44*b40554a2SAndroid Build Coastguard WorkerGDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/lib/rustlib/etc" 45*b40554a2SAndroid Build Coastguard Worker# Get the commit hash for path remapping 46*b40554a2SAndroid Build Coastguard WorkerRUSTC_COMMIT_HASH="$("$RUSTC" -vV | sed -n 's/commit-hash: \([a-zA-Z0-9_]*\)/\1/p')" 47*b40554a2SAndroid Build Coastguard Worker 48*b40554a2SAndroid Build Coastguard Worker# Set the environment variable `RUST_GDB` to overwrite the call to a 49*b40554a2SAndroid Build Coastguard Worker# different/specific command (defaults to `gdb`). 50*b40554a2SAndroid Build Coastguard WorkerRUST_GDB="${RUST_GDB:-gdb}" 51*b40554a2SAndroid Build Coastguard Worker 52*b40554a2SAndroid Build Coastguard Worker# Set the environment variable `RUST_GDBGUI` to overwrite the call to a 53*b40554a2SAndroid Build Coastguard Worker# different/specific command (defaults to `gdbgui`). 54*b40554a2SAndroid Build Coastguard WorkerRUST_GDBGUI="${RUST_GDBGUI:-gdbgui}" 55*b40554a2SAndroid Build Coastguard Worker 56*b40554a2SAndroid Build Coastguard Worker# These arguments get passed through to GDB and make it load the 57*b40554a2SAndroid Build Coastguard Worker# Rust pretty printers. 58*b40554a2SAndroid Build Coastguard WorkerGDB_ARGS="--directory=\"$GDB_PYTHON_MODULE_DIRECTORY\" \ 59*b40554a2SAndroid Build Coastguard Worker -iex \"add-auto-load-safe-path $GDB_PYTHON_MODULE_DIRECTORY\" \ 60*b40554a2SAndroid Build Coastguard Worker -iex \"set substitute-path /rustc/$RUSTC_COMMIT_HASH $RUSTC_SYSROOT/lib/rustlib/src/rust\"" 61*b40554a2SAndroid Build Coastguard Worker 62*b40554a2SAndroid Build Coastguard Worker# Finally we execute gdbgui. 63*b40554a2SAndroid Build Coastguard WorkerPYTHONPATH="$PYTHONPATH:$GDB_PYTHON_MODULE_DIRECTORY" \ 64*b40554a2SAndroid Build Coastguard Worker exec ${RUST_GDBGUI} \ 65*b40554a2SAndroid Build Coastguard Worker --gdb-cmd "${RUST_GDB} ${GDB_ARGS}" \ 66*b40554a2SAndroid Build Coastguard Worker "${@}" 67*b40554a2SAndroid Build Coastguard Worker 68