160 lines
5.3 KiB
Plaintext
Raw Normal View History

2022-07-30 11:50:01 +08:00
#!/bin/bash
# -*- shell-script -*-
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008,
# 2009 Rocky Bernstein rocky@gnu.org
#
# bashdb is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2, or (at your option) any later
# version.
#
# bashdb is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with bashdb; see the file COPYING. If not, write to the Free Software
# Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
#
# The alternate way to invoke debugger, "bash --debugger", has some
# advantages: it sets $0 correctly and doesn't show this script in
# the call trace. However the bash has been a bit inflexible and
# quirky so sadly this script seems to be needed more than it would
# normally.
[[ -z $_Dbg_ver ]] && typeset _Dbg_ver=\
'$Id: bashdb.in,v 1.48 2008/10/30 08:22:23 rockyb Exp $'
# This routine gets called via the -c or --command option and its sole
# purpose is to capture the command string such as via "x $*" or
# in a traceback ("where").
function _Dbg_eval {
eval $*
}
# Name we refer to ourselves by
typeset _Dbg_debugger_name='bashdb'
# The shell we are configured to run under.
typeset _Dbg_shell='/bin/bash'
# The release name we are configured to run under.
typeset _Dbg_release='4.0-0.4'
# The short shell name. Helps keep code common in bash, zsh, and ksh debuggers.
typeset _Dbg_shell_name=${_Dbg_shell##*/} # Equivalent to basename(_Dbg_shell)
# Original $0. Note we can't set this in an include.
typeset _Dbg_orig_0=$0
# Equivalent to basename $0; the short program name
typeset _Dbg_pname=${0##*/}
## Stuff set by autoconf/configure ###
typeset prefix=/usr/local
typeset _Dbg_libdir=${prefix}/share/bashdb
###
[[ ! -d $_Dbg_libdir ]] && _Dbg_libdir='.'
# Parse just the libdir option
# Show basename only in location listing. This is needed in regression tests
typeset -i _Dbg_basename_only=${BASHDB_BASENAME_ONLY:-0}
typeset _Dbg_bashdb_main=/usr/local/lib/bashdb/bashdb-main.inc
typeset -x _Dbg_libdir=${_Dbg_bashdb_main%/*} # dirname(_Dbg_bashdb_main)
# typeset _Dbg_libdir=${prefix}/share/bashdb
typeset _Dbg_main=dbg-main.sh
typeset _Dbg_bindir=$(dirname $0)
# What to set for location of helper routines?
if [[ ! -e $_Dbg_libdir/$_Dbg_main ]] ; then
# Use bindir/../share as fallback
_Dbg_libdir=
if [[ -d $_Dbg_bindir/../share/bashdb ]] ; then
_Dbg_libdir=$_Dbg_bindir/../share/bashdb
fi
fi
# Parse just the library option
typeset -ax _Dbg_script_args=("$@")
typeset -i _Dbg_i
for ((_Dbg_i=0; _Dbg_i<${#_Dbg_script_args[@]}-1; _Dbg_i++)) ; do
typeset arg=${_Dbg_script_args[$_Dbg_i]}
if [[ $arg == '-L' || $arg == '--library' ]] ; then
((_Dbg_i++))
_Dbg_libdir="${_Dbg_script_args[$_Dbg_i]}"
break
fi
done
if [[ ! -d $_Dbg_libdir ]] && [[ ! -d $_Dbg_libdir ]] ; then
echo "${_Dbg_pname}: Can't read debugger library directory '${_Dbg_libdir}'."
echo "${_Dbg_pname}: Perhaps bashdb is installed wrong (if its installed)." >&2
echo "${_Dbg_pname}: Try running bashdb using -L (with a different directory)." >&2
echo "${_Dbg_pname}: Run bashdb --help for a list and explanation of options." >&2
exit 1
fi
# Pull in the rest of the debugger code.
typeset _Dbg_main="$_Dbg_libdir/dbg-main.sh"
if [[ ! -r $_Dbg_main ]] ; then
print "${_Dbg_pname}: Can't read debugger library file '${_Dbg_main}'."
print "${_Dbg_pname}: Perhaps bashdb is installed wrong (if its installed)." >&2
print "${_Dbg_pname}: Try running bashdb using -L (with a different directory)." >&2
print "${_Dbg_pname}: Run bashdb --help for a list and explanation of options." >&2
exit 1
fi
. $_Dbg_libdir/dbg-main.sh ;
# I don't know why when this is done in dbg-opts.sh it doesn't have
# an effect.
((OPTLIND > 0)) && shift "$((OPTLIND - 1))"
if (($# == 0)) && [[ -z $_Dbg_EXECUTION_STRING ]] ; then
echo >&2 "${_Dbg_pname}: need to give a script to debug or use the -c option."
exit 1
fi
_Dbg_script_file="$1"
shift
if [[ ! -d $_Dbg_tmpdir ]] && [[ ! -w $_Dbg_tmpdir ]] ; then
echo "${_Dbg_pname}: cannot write to temp directory $_Dbg_tmpdir." >&2
echo "${_Dbg_pname}: Use -T try directory location." >&2
exit 1
fi
# Note that this is called via bashdb rather than "bash --debugger"
_Dbg_script=1
if [[ -n $_Dbg_EXECUTION_STRING ]] ; then
_Dbg_script_file=$(_Dbg_tempname cmd)
echo "$_Dbg_EXECUTION_STRING" >$_Dbg_script_file
fi
if [[ ! -r "$_Dbg_script_file" ]] ; then
echo "${_Dbg_pname}: cannot read program to debug: ${_Dbg_script_file}." >&2
exit 1
fi
typeset -r _Dbg_Dbg_script_file=$(_Dbg_expand_filename $_Dbg_script_file)
if ((_Dbg_linetrace)) ; then
# No stepping.
_Dbg_write_journal_eval "_Dbg_step_ignore=-1"
_Dbg_QUIT_ON_QUIT=1
else
# Set to skip over statements up to ". $_Dbg_script_file"
_Dbg_write_journal_eval "_Dbg_step_ignore=3"
fi
_Dbg_init_default_traps
trap '_Dbg_debug_trap_handler 0 "$BASH_COMMAND" "$@"' DEBUG
set -o functrace
. "$_Dbg_script_file"
# end of bashdb