如何使断点在bashdb中工作

时间:2012-03-06 09:16:15

标签: linux shell

我按照本手册倾向于使用bashdb: http://archive09.linux.com/articles/153383.html#commentthis 当我使用bashdb来编写脚本时:

#!/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

以下是调试的详细信息:   kaiwii @ ubuntu:〜/ shell_test $ bash --debugger ./fibonacci.sh     bashdb调试器,发布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

我的问题是当我使用命令时,在使用命令后继续,打破斐波那契 ,它确实停在方法的开头,斐波那契,而是退出脚本。

1 个答案:

答案 0 :(得分:3)

这是处理“break”命令时bashdb(版本4.2-0.8及更低版本)中的错误。

“next”命令设置一个标志,告诉bash跳过函数,“break”命令不清除它。

git sources有修复,所以如果你可以使用它,这是获得修复的一种方法。

另一种方法是找到安装bashdb/lib/break.sh的位置(假设它位于/usr/share/lib/bashdb/lib/break.sh中)并将下面的补丁保存在/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\""

然后以root身份运行:

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