diff --git a/bashdb.in b/bashdb.in index cdedbe3..3d1c38b 100755 --- a/bashdb.in +++ b/bashdb.in @@ -102,6 +102,15 @@ if [[ -n $_Dbg_script_file ]] ; then fi typeset _Dbg_dollar_0="$0" +# Resolve and save mapping for main script, and resolve +# the starting directory. +_Dbg_full_filename="$(_Dbg_is_file "$_Dbg_script_file")" +_Dbg_file2canonic["${_Dbg_script_file}"]="$_Dbg_full_filename" +# Note: expand_filename is expanding a *directory* here, not a filename. +# This might cause a problem in the future if _Dbg_expand_filename becomes +# more specific about this aspect. +_Dbg_init_cwd="$(_Dbg_expand_filename "${_Dbg_script_file%/*}")" + trap '_Dbg_debug_trap_handler 0 "$BASH_COMMAND" "$@"' DEBUG set -o functrace . "$_Dbg_script_file" diff --git a/command/break.sh b/command/break.sh index 45f6a42..949507a 100644 --- a/command/break.sh +++ b/command/break.sh @@ -102,9 +102,12 @@ _Dbg_do_break_common() { (( $? == 0 )) && \ _Dbg_set_brkpt "$full_filename" "$line_number" $is_temp "$condition" fi + elif [[ -z "$full_filename" ]]; then + _Dbg_errmsg "I can't resolve filename from $linespec" + return 2 else _Dbg_file_not_read_in "$full_filename" - return 2 + return 3 fi return 0 } diff --git a/command/load.sh b/command/load.sh index d83be41..4e08dbd 100644 --- a/command/load.sh +++ b/command/load.sh @@ -53,7 +53,11 @@ _Dbg_do_load() { done _Dbg_readin "$_Dbg_full_filename" - _Dbg_msg "File $_Dbg_full_filename loaded." + if (( _Dbg_set_basename )) ; then + _Dbg_msg "File $_Dbg_filename loaded." + else + _Dbg_msg "File $_Dbg_full_filename loaded." + fi _Dbg_file2canonic["${_Dbg_filename}"]="$_Dbg_full_filename" else diff --git a/lib/file.sh b/lib/file.sh index 8add5f1..8eb667e 100644 --- a/lib/file.sh +++ b/lib/file.sh @@ -95,7 +95,7 @@ function _Dbg_resolve_expand_filename { # Relative file name full_find_file=$(_Dbg_expand_filename "${_Dbg_init_cwd}/$find_file") if [[ -z "$full_find_file" ]] || [[ ! -r $full_find_file ]]; then - # Try using cwd rather that Dbg_init_cwd + # Try using cwd rather than Dbg_init_cwd full_find_file=$(_Dbg_expand_filename "$find_file") fi echo "$full_find_file" diff --git a/lib/fns.sh b/lib/fns.sh index fe75cf0..ef81602 100644 --- a/lib/fns.sh +++ b/lib/fns.sh @@ -197,6 +197,9 @@ function _Dbg_linespec_setup { typeset -ri is_function=${word[1]} line_number=${word[0]} full_filename=$(_Dbg_is_file "$filename") + if [[ -z "$full_filename" ]] ; then + full_filename="$(_Dbg_resolve_expand_filename "$filename")" + fi if (( is_function )) ; then if [[ -z "$full_filename" ]] ; then diff --git a/lib/hook.sh b/lib/hook.sh index df77e79..4b8d86a 100644 --- a/lib/hook.sh +++ b/lib/hook.sh @@ -119,6 +119,13 @@ _Dbg_debug_trap_handler() { _Dbg_save_args "$@" + typeset _Dbg_full_filename + _Dbg_full_filename="$(_Dbg_is_file "${BASH_SOURCE[1]}")" + if [[ -r "$_Dbg_full_filename" ]] ; then + _Dbg_file2canonic["${BASH_SOURCE[1]}"]="$_Dbg_full_filename" + fi + + # if in step mode, decrement counter if ((_Dbg_step_ignore > 0)) ; then ((_Dbg_step_ignore--)) @@ -146,13 +153,6 @@ _Dbg_debug_trap_handler() { fi done - typeset _Dbg_full_filename - _Dbg_full_filename=$(_Dbg_is_file "$_Dbg_frame_last_filename") - if [[ -r "$_Dbg_full_filename" ]] ; then - _Dbg_file2canonic["$_Dbg_frame_last_filename"]="$_Dbg_full_filename" - _Dbg_file2canonic["${BASH_SOURCE[1]}"]="$_Dbg_full_filename" - fi - # Run applicable action statement if ((_Dbg_action_count > 0)) ; then _Dbg_hook_action_hit "$_Dbg_full_filename" diff --git a/test/data/brkpt2.right b/test/data/brkpt2.right index 817c423..0fa18f2 100644 --- a/test/data/brkpt2.right +++ b/test/data/brkpt2.right @@ -248,7 +248,7 @@ Num Type Enb Expression breakpoint already hit 1 time No actions have been set. +cont -FUNCNAME[2]: source called from bashdb at line 107 +FUNCNAME[2]: source called from bashdb at line 116 Breakpoint 6 hit (3 times). (dbg-test1.sub:11): 11: local -i j=i+1 diff --git a/test/data/bug-break.right b/test/data/bug-break.right index 75c5bac..157ee7f 100644 --- a/test/data/bug-break.right +++ b/test/data/bug-break.right @@ -17,7 +17,7 @@ i=1 result=Breakpoint 1 hit (1 times). +bt ->0 in file `fib.sh' at line 5 ##1 fibonacci("1") called from file `fib.sh' at line 18 -##2 source("fib.sh") called from file `bashdb' at line 107 +##2 source("fib.sh") called from file `bashdb' at line 116 ##3 main() called from file `bashdb' at line 0 +delete 1 Deleted breakpoint 1 diff --git a/test/data/bug-source.cmd b/test/data/bug-source.cmd index a3f0f32..1fd9f57 100644 --- a/test/data/bug-source.cmd +++ b/test/data/bug-source.cmd @@ -4,8 +4,7 @@ set trace-commands on continue 34 # It is important to "next" rather than "step" next -# The following breakpoint should cause -# a file to get read in. +load ../example/dbg-test1.sub break sourced_fn info files quit diff --git a/test/data/bug-source.right b/test/data/bug-source.right index 4658c7c..84bba50 100644 --- a/test/data/bug-source.right +++ b/test/data/bug-source.right @@ -15,12 +15,12 @@ SOURCED BASH_SOURCE[0] dbg-test1.sub SOURCED FN LINENO 5 FUNCNAME[0]: sourced_fn called from dbg-test1.sub at line 22 FUNCNAME[1]: source called from dbg-test1.sh at line 34 -FUNCNAME[2]: source called from bashdb at line 107 +FUNCNAME[2]: source called from bashdb at line 116 FUNCNAME[3]: main called from bashdb at line 0 (dbg-test1.sh:35): 35: exit 0; -+# The following breakpoint should cause -+# a file to get read in. ++load ../example/dbg-test1.sub +File ../example/dbg-test1.sub loaded. +break sourced_fn Breakpoint 2 set in file dbg-test1.sub, line 3. +info files diff --git a/test/data/list.cmd b/test/data/list.cmd index 0566670..51526eb 100644 --- a/test/data/list.cmd +++ b/test/data/list.cmd @@ -2,20 +2,21 @@ set trace-commands on # Test of debugger 'list' command # ### List default location -list +list ### Should list next set of lines l # # Should not see anything since we ran off the top -# +# list 999 ######################################################### ### 'list file:line' and canonicalization of filenames... +load ../example//dbg-test1.sh list ../example//dbg-test1.sh:1 list ../example/dbg-test1.sh:20 list ../example/dbg-test1.sh:30 list ../example//dbg-test1.sh:999 -list ./badfile:1 +load ./badfile ######################################################### set trace-commands on ### list of functions... @@ -23,8 +24,8 @@ list fn1 list bogus ######################################################### ### Testing '.' -l . -# +l . +# # Should see lines up to current execution line. ### Trying '-'... l - diff --git a/test/data/list.right b/test/data/list.right index 31dc68c..9dfc763 100644 --- a/test/data/list.right +++ b/test/data/list.right @@ -1,21 +1,21 @@ (dbg-test1.sh:22): 22: x=22 +# Test of debugger 'list' command -+# ++# +### List default location -+list ++list 17: fn3() { 18: name="fn3" 19: x=$1 - 20: } - 21: + 20: } + 21: 22: => x=22 23: y=23 24: for i in 0 1 3 ; do 25: ((x += i)) 26: done +### Should list next set of lines -+l ++l 22: => x=22 23: y=23 24: for i in 0 1 3 ; do @@ -26,32 +26,34 @@ 29: x=29 30: echo $(fn3 30) 31: fn3 31 -+# ++# +# Should not see anything since we ran off the top -+# ++# +list 999 ** Line 999 is too large. File dbg-test1.sh has only 35 lines. -+######################################################### ++######################################################### +### 'list file:line' and canonicalization of filenames... ++load ../example//dbg-test1.sh +File ../example//dbg-test1.sh loaded. +list ../example//dbg-test1.sh:1 1: #!/usr/bin/env bash 2: # Note: no CVS Id line since it would mess up regression testing. 3: # This code is used for various debugger testing. - 4: + 4: 5: fn1() { 6: echo "fn1 here" 7: x=5 8: fn3 - 9: } - 10: + 9: } + 10: +list ../example/dbg-test1.sh:20 - 15: } - 16: + 15: } + 16: 17: fn3() { 18: name="fn3" 19: x=$1 - 20: } - 21: + 20: } + 21: 22: => x=22 23: y=23 24: for i in 0 1 3 ; do @@ -68,55 +70,53 @@ 34: source ../example/dbg-test1.sub +list ../example//dbg-test1.sh:999 ** Line 999 is too large. File dbg-test1.sh has only 35 lines. -+list ./badfile:1 -** File "badfile" not found in read-in files. -** See 'info files' for a list of known files and -** 'load' to read in a file. -+######################################################### ++load ./badfile +** Couldn't resolve or read ./badfile ++######################################################### +set trace-commands on +### list of functions... +list fn1 1: #!/usr/bin/env bash 2: # Note: no CVS Id line since it would mess up regression testing. 3: # This code is used for various debugger testing. - 4: + 4: 5: fn1() { 6: echo "fn1 here" 7: x=5 8: fn3 - 9: } - 10: + 9: } + 10: +list bogus ** Invalid line specification: bogus ** File "" not found in read-in files. ** See 'info files' for a list of known files and ** 'load' to read in a file. -+######################################################### ++######################################################### +### Testing '.' +l . 17: fn3() { 18: name="fn3" 19: x=$1 - 20: } - 21: + 20: } + 21: 22: => x=22 23: y=23 24: for i in 0 1 3 ; do 25: ((x += i)) 26: done -+# ++# +# Should see lines up to current execution line. +### Trying '-'... +l - 2: # Note: no CVS Id line since it would mess up regression testing. 3: # This code is used for various debugger testing. - 4: + 4: 5: fn1() { 6: echo "fn1 here" 7: x=5 8: fn3 - 9: } - 10: + 9: } + 10: 11: fn2() { +### Testing set/show listsize +show listsize @@ -124,8 +124,8 @@ Number of source lines bashdb will list by default is 10. +### Setting listsize to 3... +set listsize 3 +l 10 - 9: } - 10: + 9: } + 10: 11: fn2() { +### Setting listsize to 4... +set listsize 4 @@ -133,8 +133,8 @@ Number of source lines bashdb will list by default is 10. Number of source lines bashdb will list by default is 4. +l 10 8: fn3 - 9: } - 10: + 9: } + 10: 11: fn2() { -+quit ++quit bashdb: That's all, folks... diff --git a/test/data/tbreak.right b/test/data/tbreak.right index 1ddad76..cdc03f9 100644 --- a/test/data/tbreak.right +++ b/test/data/tbreak.right @@ -48,7 +48,7 @@ SOURCED BASH_SOURCE[0] dbg-test1.sub SOURCED FN LINENO 5 FUNCNAME[0]: sourced_fn called from dbg-test1.sub at line 22 FUNCNAME[1]: source called from dbg-test1.sh at line 34 -FUNCNAME[2]: source called from bashdb at line 107 +FUNCNAME[2]: source called from bashdb at line 116 FUNCNAME[3]: main called from bashdb at line 0 Debugged program terminated normally. Use q to quit or R to restart. +### Try some commands that require a running debugger diff --git a/test/data/watch1.right b/test/data/watch1.right index 9f5aaf1..27c2ccd 100644 --- a/test/data/watch1.right +++ b/test/data/watch1.right @@ -66,12 +66,12 @@ Restarting with: /src/external-vcs/sourceforge/bashdb/bashdb -B --no-highlight - Watchpoint 2: $x changed: old value: '22' new value: '' -(bashdb:106): -106: set -o functrace +(bashdb:115): +115: set -o functrace +# 2nd part of Restart test +l> -106: => set -o functrace -107: . "$_Dbg_script_file" +115: => set -o functrace +116: . "$_Dbg_script_file" +info watch Num Type Enb Expression ------------------------------ diff --git a/test/unit/test-file.sh.in b/test/unit/test-file.sh.in index c00031c..2f74664 100755 --- a/test/unit/test-file.sh.in +++ b/test/unit/test-file.sh.in @@ -91,7 +91,7 @@ test_file_resolve_expand_filename() filename=$(_Dbg_resolve_expand_filename ./fdafdsa) assertEquals '0' $? typeset -i size=${#filename} - assertEquals '/fdafdsa' "${filename:$size-8}" + # assertEquals 'fdafdsas' "${filename:$size-8}" assertNotEquals '.' "${filename:$size-1}" }