shell脚本调试工具的安装和使用

前言

目前在查看Android源码时候发现有很多shell脚本,由于方便我自己去调试脚本,就去查找了下脚本调试工具bashdb,如果大家之前使用过gdb的调试工具可以很容易的掌握,下面是我对常用命令的使用心得分享,更详细的内容可以查看文章末尾提供的链接,有官网的参考文档可以给大家学习。

1.安装

这里我的环境是Mac的安装步骤,其他平台安装请自行google。

  • 1.打开Terminal
  • 2.运行 ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” < /dev/null 2> /dev/null
  • 3.运行:brew install bashdb

注意:下载过程可能需要

2.使用bashdb

  • 别名显示
    我们再调试的时候,可以进行别名显示,方便我们使用。
bashdb<0> show alias
  cont: continue    |  fin: finish   |  list>: list  |  h: help
  q!: quit          |  !: history    |  x: examine   |  ev: eval
  bash: shell       |  exit: quit    |  ed: edit     |  eval?: eval
  ?: help           |  W: watch      |  s: step      |  d: clear
  where: backtrace  |  T: backtrace  |  sh: shell    |  c: continue
  s-: step-         |  R: run        |  q: quit      |  b: break
  s+: step+         |  pr: print     |  n: next      |  a: action
  bt: backtrace     |  restart: run  |  l: list
  l>: list          |  ev?: eval     |  i: info

2.1 准备调试脚本

  • 创建debug.shshell脚本准备调试
#!/bin/bash
function print
{
    for test in Alabama Alaska Arizona Arkansas California Colorado
    do
        echo The next state is $test
    done
}
function getdate
{
    echo date +'%Y-%m-%d'
}
echo "Hello $USER,"
echo "Today is $(getdate)"

2.2 进入调试模式

  • 命令
bashdb <调试文件>
  • 日志
MartindeMacBook-Pro:android_shell martin$ bashdb debug.sh
bash debugger, bashdb, release 4.4-0.94

Copyright 2002-2004, 2006-2012, 2014, 2016-2017 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.

(/Users/martin/Workspace/Linux/android_shell/debug.sh:13):
13:	echo "Hello $USER,"
bashdb<0>

2.3 查看程序

  • 命令
    在待输入光标区域输入l查看被调试的shell脚本(这里的l是指list单词)。在l后面可以直接跟行号显示
bashdb<0> l 行号
  • 日志
bashdb<1> l 1
  1:    #!/bin/bash
  2:    function print
  3:    {
  4:        for test in Alabama Alaska Arizona Arkansas California Colorado
  5:        do
  6:            echo The next state is $test
  7:        done
  8:    }
  9:    function getdate
 10:    {

如果shell脚本文件过长会以分页的方式显示,我们可以点击Enter键进行翻页操作。

2.4 断点相关操作

2.4.1查看断点信息

  • 命令
    在带输入区域输入i b(这里是info break的缩写)。
bashdb<2>  i b
  • 日志
bashdb<2>  i b
No breakpoints have been set.

上面表示没有打过任何断点。

2.4.2 b(reak) 行号

  • 命令
bashdb<3> b 2
  • 日志
bashdb<3> b 6
Breakpoint 2 set in file /Users/martin/Workspace/Linux/android_shell/debug.sh, line 6.

2.4.3 b(reak) 函数名

  • 命令
bashdb<2> b <函数名>
  • 日志
bashdb<2> b getdate
Breakpoint 1 set in file /Users/martin/Workspace/Linux/android_shell/debug.sh, line 2.

2.4.4 b(reak) 行号 if 条件

  • 命令
bashdb<0> b if $test==Alabama
  • 日志
bashdb<2> l 1
  1:    #!/bin/bash
  2:    function print
  3:    {
  4:        for test in Alabama Alaska Arizona Arkansas California Colorado
  5:        do
  6:            echo The next state is $test
  7:        done
  8:    }
  9:    function getdate
 10:    {
bashdb<3> b 6 if$test==Alabama
Breakpoint 1 set in file /Users/martin/Workspace/Linux/android_shell/debug.sh, line 6.

2.5 删除断点

2.5.1 d(elete)

  • 命令
    在删除断点的时候,我们需要先查看一下当前断点的所在行号,然后删除断点行号即可。
bashdb<4> d 2
  • 日志
bashdb<8> i b
Num Type       Disp Enb What
2   breakpoint keep y   /Users/martin/Workspace/Linux/android_shell/debug.sh:2
3   breakpoint keep y   /Users/martin/Workspace/Linux/android_shell/debug.sh:10
bashdb<9> d 10
Removed 1 breakpoint(s).
bashdb<10> i b
Num Type       Disp Enb What
2   breakpoint keep y   /Users/martin/Workspace/Linux/android_shell/debug.sh:2

2.3 运行

r(run):运行脚本

bashdb<1> run
  • 日志
bashdb<9> run
Restarting with: /usr/local/bin/bashdb debug.sh
bash debugger, bashdb, release 4.4-0.94

Copyright 2002-2004, 2006-2012, 2014, 2016-2017 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.

(/Users/martin/Workspace/Linux/android_shell/debug.sh:13):
13:	echo "Hello $USER,"

c(ontinue):继续运行到下一个断点

bashdb<0> c
  • 日志
bashdb<0> c
Hello martin,
Today is date +%Y-%m-%d
Debugged program terminated normally. Use q to quit or R to restart.

q(quit):退出当前程序

  • 命令
bashdb<1> q
  • 日志
bashdb<1> q
bashdb: That's all, folks...

2.5 单步调试

n(next)

step over:如果正在调用一个子函数,不会跟到函数内部

  • 命令
bashdb<0> n
  • 日志
bashdb<0> n
Hello martin,
(/Users/martin/Workspace/Linux/android_shell/debug.sh:14):
14:	echo "Today is $(getdate)"

s(step)

step into:如果正在调用一个子函数,不会跟到函数内部

  • 命令
bashdb<0> s
  • 日志
bashdb<1> s
(/Users/martin/Workspace/Linux/android_shell/debug.sh:14):
14:	echo "Today is $(getdate)"
getdate

f(finish)

step return:如果正在调用一个子函数,并且进入函数内部,会退出到喊出。

  • 命令
bashdb<(2)> finish
  • 日志
bashdb<(2)> finish
Today is date +%Y-%m-%d
Debugged program terminated normally. Use q to quit or R to restart.

2.6 打印值

p(print)

用于打印当前变量的值

  • 命令
bashdb<6> pr <打印的变量>
  • 日志
Hello martin,
(/Users/martin/Workspace/Linux/android_shell/debug.sh:14):
14:	echo "Today is $(getdate)"
bashdb<6> pr $USER
martin

w(watch)

监控当前变量的值,当有值发生改变的时候,就改变值。

  • 命令
bashdb<1> watch <变量名称不带$号>
  • 日志
bashdb<1> watch USER
 0: ($USER)==martin arith: 0
bashdb<2> n

参考链接

  • 官网参考文档
  • Centos7.3 安装bashdb和vim bash-support插件

你可能感兴趣的:(搭建研发环境)