开头
IC中常用的脚本语言有python,perl,makefile,shell等。对于新接手的脚本,若要做一些小修小改,调试的方法除了加打印信息外,最便捷的方式就是单步调试了。
熟悉掌握一个脚本,不外乎两点 1:脚本的运行逻辑 2:脚本的数据结构和变量使用。 使用单步调试可以快速帮助我们熟悉一个复杂的脚本。
之前接触一个7K+行的perl脚本,当你需要关注其中某一个功能时,使用单步调试,可以从开始运行的第一行代码开始,追踪脚本运行这个功能时所走的分支,关注你所需的代码段。可以增加断点,随时的打印变量。
当然很多IDE拥有更加强大的调试功能,例如python的PyCharm
。 但是IC公司的linux环境都是无法联网的,甚至有的连python的版本都是2.x的,更别奢求安装丰富的IDE了。
下面介绍下使用脚本内置的方式,不借助IDE的调试方法:
开始之前先看一下C语言的调试。不同语言,调试命令和调试方法大致相同,这里有一个完整的调试流程演示,帮助我们快速熟悉单步调试:🔗C语言入门-第 10 章 gdb 。
C
gcc -g main.c -o main
生成包含源码信息的可执行文件main
gdb main
进入debug shell
help
:查看相关命令
Python
在正常运行的方式上加上 -m pdb
, 如 python -m pdb xxx.py -tc xxx
help
得到相关命令:
help [cmd]
显示命令的具体解释:
常用命令:
命令 | 解释 |
---|---|
b(reak) | 设置断点 |
c(ontinue) | 继续执行程序 |
l(ist) | 查看当前行的代码段 |
s(tep) | 进入函数 |
r(eturn) | 执行代码直到从当前函数返回 |
n(ext) | 执行下一行 |
pp | 打印变量的值 |
a(rgs) | 查看全部栈内变量 |
回车 | 重复上一条命令 |
q(uit) | 退出 |
Perl
perl -d xxx.pl -tc xxx
使用 -d
进入debug模式。
h
显示命令:
常用命令:
命令 | 解释 |
---|---|
n | 下一步,不可进入子程序 |
s | 单步,可进入子程序 |
r | s进入子程序之后,按r可退出 |
p | 等同于print |
x | 输出你要查看的变量的值,x \ %hash 查看哈希 |
l | 列出将要执行的代码, |
- | 列出当前代码前的源代码 |
c x | 告诉调试器运行到第x 行后停下来 |
b x | 在指定x 行或者子程序处设置断点 |
w | 设置观察点 |
回车 | 同n |
q | 退出 |
shell
csh -- help
bash -- help
针对于bash
,bash -x xxx.bash -tx xxx
,-x
提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。(cshell使用方式一样)
设置环境变量export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}:'
在每一行前加上文件的行号,方便查看。
Makefile
make -f xxx.mk TC=xxxx -n
,-n
不实际执行,但把规则和连带规则下的命令打印出来。方便查看Makefile的执行流程。
对于变量的查看,可以创建一个vars.mk
## vars.mk
%:
@echo '$*=(*)'
d-%:
@echo '$*=(*)'
@echo ' origin = (origin*)'
@echo ' value = $(value $*)'
@echo ' flavor = (flavor*)'
make -f xxx.mk TC=xxx -n -f var.mk d-TC
通过d-TC
可以指定查看xxx.mk
中的TC
变量。
小结
对于Python,Perl,单步调试可以增加断点,随时打印变量。对于Bash, Makefile,不支持单步调试,只可以一次性打印出执行流程。更多功能,需要配合其他debugger工具使用。
对于SystemVerilog,需要Verdi配合仿真工具VCS进行单步调试,可以查看函数内的auto局部变量和堆栈结构,参考userguide.