shell bashdb调试

shell作为linux上的脚本,语法相对其他编程语言要简单,没有ide支持,想要断点调试是比较困难的。shell -x可以简单的跟踪代码执行,而bashdb的调试功能非常丰富和强大

1. shell调试

1.1 shell自带-x和-n 参数

1.1 -x 参数表示打印出trace信息

+号的表示是代码行,不带的表示是echo输出

1
2
3
4
5
6
$ bash -x a.sh
+ a='hello world'
+ echo 'A is:'
A is:
+ echo hello world
hello world

如果只想调试代码中一块代码的话,可以在代码中插入set -x来开启代码块的调试功能

1
2
3
4
5
set -x
...
some code
...
set +x

1.2 -n 参数只检查脚本是否正确,而不真的执行

如果没有错误,不会有任何输出

1
$ bash -n a.sh

2. bashdb

bashdb是一个bash debug工具,可以单步执行,设置断点和显示变量值,功能强大

不是内置的工具,需要自己安装,从这里下载 bashdb.sourceforge.net

bashdb --debug file 即可开始调试,示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ bashdb --debug a.sh
bash debugger, bashdb, release 4.2-0.8
(/home/xx/work/a.sh:3):
3: a="hello world"
bashdb<0> n
(/home/xx/work/a.sh:5):
5: echo "A is:"
bashdb<1> l
1: #!/bin/bash
2: #对变量赋值:
3: a="hello world"
4: # 现在打印变量a的内容:
5: => echo "A is:"
6: echo $a + $b
7: echo "----------------begin-----------------"
8:
9: awk '{sum+=1} END{print sum}' test.sh
10:
bashdb<2>

可以使用的命令如下:

显示源码

1
2
3
1.列出代码和查询代码类:
l 列出当前行以下的10行
/pat/ 向后搜索pat

代码执行调试:

1
2
3
4
5
6
7
8
9
10
11
12
13
n 执行下一条语句,遇到函数,不进入函数里面执行,将函数当作黑盒
s n 单步执行n次,遇到函数进入函数里面
b 行号n 在行号n处设置断点
d 行号n 撤销行号n处的断点
c 行号n 一直执行到行号n处,如果没有写n参数,则直接执行到下一个断点处
R 重新启动
Finish 执行到程序最后
cond n expr 条件断点
print $a 表示显示变量a的值
clear 或者d,清除所有的断点
disable / enable 禁用、启用断点
skip [count] 跳过下面一些代码
return 跳出

stack信息

1
2
3
w 打印当前的stack信息
up 上跳一层frame
down 下跳一层frame

其他命令

1
2
3
4
5
h 帮助
help 命令 得到命令的具体信息
q 退出bashdb
x 算数表达式 计算算数表达式的值,并显示出来
!!空格Shell命令 参数 执行shell命令

参考文档

http://blog.chinaunix.net/uid-24993439-id-3350742.html
http://www.cnblogs.com/softwaretesting/archive/2012/02/06/2339671.html
http://www.rodericksmith.plus.com/outlines/manuals/bashdbOutline.html