shell腳本調試之工具——bashdb

shell腳本調試之工具——bashdb

原文件

https://sourceforge.net/projects/bashdb/files/

 

bash是Unix/Linux操作系統最常用的shell之一,它非常靈活,和awk、c++配合起來異常強大


以下使用一個測試腳本來說明使用bash調試的方法
test.sh

[plain] view plaincopy

  1. #!/bin/bash  
  2.   
  3. echo "----------------begin-----------------"  
  4.   
  5. awk '{sum+=1} END{print sum}' test.sh  
  6.   
  7. MAX=3  
  8. for ((i = 0; i < MAX; i++))  
  9. do  
  10.         loaddate=`date -d"-$i day" +%Y-%m-%d`  
  11.         echo $loaddate  
  12. done  
  13.   
  14. echo "----------------end-----------------"  

 

1. 使用bash -x

bash -x打印出腳本執行過程中的所有語句
like:

$ bash -x test.sh

斷點

+ echo ----------------begin-----------------
----------------begin-----------------
+ awk '{sum+=1} END{print sum}' test.sh
14
+ MAX=3
+ (( i = 0 ))
+ (( i < MAX ))
++ date '-d-0 day' +%Y-%m-%d
+ loaddate=2013-03-05
+ echo 2013-03-05
2013-03-05
+ (( i++ ))
+ (( i < MAX ))
++ date '-d-1 day' +%Y-%m-%d
+ loaddate=2013-03-04
+ echo 2013-03-04
2013-03-04
+ (( i++ ))
+ (( i < MAX ))
++ date '-d-2 day' +%Y-%m-%d
+ loaddate=2013-03-03
+ echo 2013-03-03
2013-03-03
+ (( i++ ))
+ (( i < MAX ))
+ echo ----------------end-----------------
----------------end-----------------

配合上註釋,bash -x基本可以滿足日常80%的需求
 

2. set 

有的時候,我們的腳本非常複雜,使用bash -x得到的輸出太多,很難找到需要的信息
set 可以進行局部調試,在需要調試的代碼之前加上“set -x”,需要調試的代碼之後加上“set +x”即可
like:
修改test.sh:
....
set -x

awk '{sum+=1} END{print sum}' test.sh

set +x

.....
運行:
----------------begin-----------------
+ awk '{sum+=1} END{print sum}' test.sh
16
+ set +x
2013-03-05
2013-03-04
2013-03-03
----------------end-----------------

3. 使用bash調試工具bashdb(Bash Debugger)

bashdb是一個類GDB的調試工具,使用GDB的同學使用bashdb基本無障礙
bashdb可以運行斷點設置、變量查看等常見調試操作
bashdb需要單獨安裝
使用如下:
$ bashdb --debug test.sh            
bash debugger, bashdb, release 4.2-0.8


Copyright 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 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/work/code/test.sh:3):
3:      echo "----------------begin-----------------"
bashdb<0> n  #下一步

----------------begin-----------------

(/home/work/code/test.sh:5):
5:      awk '{sum+=1} END{print sum}' test.sh
bashdb<1> l #列出上下共10行代碼
  1:    #!/bin/bash
  2:    
  3:    echo "----------------begin-----------------"
  4:    
  5: => awk '{sum+=1} END{print sum}' test.sh
  6:    
  7:    MAX=3
  8:    for ((i = 0; i < MAX; i++))
  9:    do
 10:            loaddate=`date -d"-$i day" +%Y-%m-%d`
bashdb<2> b 10 #第10行設置斷點
Breakpoint 1 set in file /home/work/code/test.sh, line 10.
bashdb<3> c #繼續運行
14
Breakpoint 1 hit (1 times).
(/home/work/code/test.sh:10):
10:             loaddate=`date -d"-$i day" +%Y-%m-%d`
bashdb<4> print $i #打印變量值
 0
 14:    echo "----------------end-----------------"

 

2) 調試工具-bashdb
使用shell調試器bashdb,這是一個類似於GDB的調試工具,可以完成對shell腳本的斷點設置,單步執行,變量觀察等許多功能。

 使用bashdb進行debug的常用命令
1.列出代碼和查詢代碼類:
l   列出當前行以下的10行
-   列出正在執行的代碼行的前面10行
.   回到正在執行的代碼行
w  列出正在執行的代碼行前後的代碼
/pat/  向後搜索pat
?pat?向前搜索pat

2.Debug控制類:
h  幫助
help 命令  得到命令的具體信息
q  退出bashdb
x 算數表達式  計算算數表達式的值,並顯示出來
!!空格Shell命令 參數  執行shell命令
使用bashdb進行debug的常用命令(cont.)
控制腳本執行類:
n   執行下一條語句,遇到函數,不進入函數裏面執行,將函數當作黑盒
s n  單步執行n次,遇到函數進入函數裏面
b 行號n  在行號n處設置斷點           #########經驗證,bashdb的break設置斷點命令必須s、s、c然後到這個斷點以後,還得從新設置下一個斷點,否則不生效,===>即再次s、s、c才行###########################
del 行號n 撤銷行號n處的斷點
c 行號n 一直執行到行號n處
R  重新啓動
Finish 執行到程序最後
cond n expr 條件斷點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章