2012-03-06 53 views
0

我遵守本手册瘦使用bashdb: http://archive09.linux.com/articles/153383.html#commentthis 当我使用bashdb对Bt脚本:如何使断点工作在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 $庆典--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 

我的问题是,当我使用的命令,继续后ū唱命令,打破斐波那契,它在方法开始时停止,斐波那契,但是退出脚本。

回答

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 
+0

我尝试第二种方式,但补丁提示这样的错误,如:kaiwii @ ubuntu:/ usr/share/bashdb/lib $ sudo patch -p0 2012-03-07 03:05:18

+1

该补丁应该不言自明 - 有些行会被添加。找到文件,编辑它并添加行。对于你我觉得也不得不补充:在你编辑它之后保存文件。 – rocky 2012-03-07 11:29:04