Search code examples
linuxshelltrepan

how to make the breakpoint work in the bashdb


i follow this manual to lean to use the bashdb: http://archive09.linux.com/articles/153383.html#commentthis And when i use the bashdb to bt the script:

#!/bin/bash

version="0.01";

fibonacci() {
    n=${1:?If you want the nth fibonacci number, you must supply n as the first parameter.}
    if [ $n -le 1 ]; then 
    echo $n
    else
    l=`fibonacci $((n-1))`
    r=`fibonacci $((n-2))`
    echo $((l + r))
    fi
}

for i in `seq 1 10`
do
  result=$(fibonacci $i)
  echo "i=$i result=$result"
done

And here is the detail of the debugging: kaiwii@ubuntu:~/shell_test$ bash --debugger ./fibonacci.sh bashdb debugger, release 4.2-0.6

Copyright 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010 Rocky Bernstein
This is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.

(/home/kaiwii/shell_test/fibonacci.sh:3):
3:  version="0.01";
bashdb<0> bt
->0 in file `./fibonacci.sh' at line 3
##1 main() called from file `./fibonacci.sh' at line 0
bashdb<1> next
(/home/kaiwii/shell_test/fibonacci.sh:16):
16: for i in `seq 1 10`
bashdb<2> list
 11:        r=`fibonacci $((n-2))`
 12:        echo $((l + r))
 13:        fi
 14:    }
 15:    
 16: => for i in `seq 1 10`
 17:    do
 18:      result=$(fibonacci $i)
 19:      echo "i=$i result=$result"
 20:    done
bashdb<3> next
(/home/kaiwii/shell_test/fibonacci.sh:18):
18:   result=$(fibonacci $i)
bashdb<4> break fibonacci
Breakpoint 1 set in file /home/kaiwii/shell_test/fibonacci.sh, line 5.
bashdb<5> continue
i=1 result=1
i=2 result=1
i=3 result=2
i=4 result=3
i=5 result=5
i=6 result=8
i=7 result=13
i=8 result=21
i=9 result=34
i=10 result=55

And my question is when i use the command,continue after using the command,break fibonacci ,it does stop at the beginning of the method,fibonacci but instead quit the script.


Solution

  • This is a bug in bashdb (version 4.2-0.8 and below) in the handling of the "break" command.

    The "next" command sets a flag that tells bash to skip over functions and the "break" command isn't clearing that.

    git sources have the fix, so if you can use that, this is one way to get the fix.

    Another way is to find where bashdb/lib/break.sh is installed (let's say it is in /usr/share/lib/bashdb/lib/break.sh) and with the patch below saved in /tmp/bashdb.patch

    --- bashdb/lib/break.sh
    +++ bashdb/lib/break.sh
    @@ -218,6 +218,11 @@ _Dbg_set_brkpt() {
         typeset dq_source_file
         dq_source_file=$(_Dbg_esc_dq "$source_file")
         typeset dq_condition=$(_Dbg_esc_dq "$condition")
    +
    +    # Make sure we are not skipping over functions.
    +    _Dbg_old_set_opts="$_Dbg_old_set_opts -o functrace"
    +    _Dbg_write_journal_eval "_Dbg_old_set_opts='$_Dbg_old_set_opts'"
    +
         _Dbg_write_journal_eval "_Dbg_brkpt_line[$_Dbg_brkpt_max]=$lineno"
         _Dbg_write_journal_eval "_Dbg_brkpt_file[$_Dbg_brkpt_max]=\"$dq_source_file\""
         _Dbg_write_journal "_Dbg_brkpt_cond[$_Dbg_brkpt_max]=\"$dq_condition\""
    

    And then run as root:

     # cd /usr/share/lib
     # patch -p0 < /tmp/bashdb.patch