【Linux】【Shell】常用调试手段一览

简介: 【Linux】【Shell】常用调试手段一览

常见问题


三种类型:


  • Syntax Error


  • Runtime Error


  • Logic Error


  • 这三种问题,难度依次增加,第一种问题,可通过对shell脚本进行静态分析,后两种问题则需要动态调试来定位。


调试手段


代码静态检查


虽然静态检查发现的问题,执行的时候也可以暴露出来。但静态检查无需执行脚本,而真正执行的话,可能大错已经铸成了。


shellcheck


一个静态bash脚本检查工具。


ShellCheck is an open source static analysis tool that automatically

finds bugs in your shell scripts.


例子:


shellcheck ./buggy.sh


shell调试选项-n(noexec)


Shell本身提供一些调试方法选项:


  • -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误


具体使用方式可参考后文shell调试选项一节,同时-n、-v可结合为-nv来使用。


/bin/sh -n ./buggy.sh


如果有问题,上述命令执行后会有错误提示。


借助IDE或编辑器


比如使用vim文本编辑器时,打开语法高亮,可发现一些简单直观的错误。


动态调试


输出信息到标准输出


  • echo方法


可以使用echo输出字符串或变量


echo "My name is $name"


  • printf方法


printf "%-8s %-14s " $cur_date $ip


shell调试选项-x(xtrace)、-v(verbose)


Shell本身提供一些调试方法选项:


  • -v,一边执行脚本,一边将执行过的脚本命令打印到标准输出


  • -x,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。


具体的使用方式有三种:


  • 1、在命令行中提供参数:


$bash -x buggy.sh


  • 2、脚本开头提供参数:


#!/bin/sh -x
 #!/bin/sh -xv


  • 3、在脚本中用set命令启用或禁用参数:其中set -x表示启用,set +x表示禁用。


格式如下:


set -x
echo $i
set +x


set -x;BuggyFunction;set +x;


上述三种方法的区别在于,前两种对脚本的所有行都启用了调试模式,第三中方式,仅对部分行启用了调试模式。


bashdb(Bash Debugger)


一个类GDB的调试工具,可以运行断点设置、变量查看等常见调试操作,具体使用方式如下:


$ bashdb --debug test.sh            
bash debugger, bashdb, release 4.2-0.8


$ bashdb --debug test.sh            


bash debugger, bashdb, release 4.2-0.8


shopt -p          //查看当前设置情况
shopt -s extdebug //启动extdebug模式
shopt -u extdebug //取消extdebug模式


但shopt依赖于bashdb,如不方便使用,可使用下面的set命令替代shopt绝大部分功能。


set -o errtrace  //打开,=set -e或-E
set -o functrace //打开,=set -f或-T
set +o errtrace  //关闭,=set -e或-E
set +o functrace //关闭,=set -f或-T


其他技巧


使用一致的调试库


将环境配置、traps、日志等放到my-debug-env中,可以保证一致的调试环境。


### Define Debug environment
### Filename: my-debug-env
trap 'echo "$BASH_COMMAND" failed with error code $?' ERR
#!/usr/bin/env bash
### Example Script
### Filename: example-debug
echo "Example Script..."
bad_command &> /dev/null
### Example output with no debug env
[me@linux ~]$ ./example-debug 
Example Script...
### Example output with the debug env
[me@linux ~]$ BASH_ENV=./my-debug-env ./example-debug
Example Script...
bad_command &> /dev/null failed with error code 127


调试陷阱/智能调试(Debugging Hook)


在调试阶段,将_DEBUG置为“on”,开启调试模式;


结束调试之后,_DEBUG=“off” 关闭调试模式。


_DEBUG="on"
function DEBUG()
{
 [ "$_DEBUG" == "on" ] &&  $@
}
DEBUG echo "File is $filename"
DEBUG set -x
Cmd1
Cmd2
DEBUG set +x


参考资料





相关文章
|
4月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
29天前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
258 6
|
1月前
|
运维 监控 Linux
BPF及Linux性能调试探索初探
BPF技术从最初的网络数据包过滤发展为强大的系统性能优化工具,无需修改内核代码即可实现实时监控、动态调整和精确分析。本文深入探讨BPF在Linux性能调试中的应用,介绍bpftune和BPF-tools等工具,并通过具体案例展示其优化效果。
79 14
|
2月前
|
缓存 NoSQL Linux
Linux调试
本文介绍了Linux调试、性能分析和追踪的培训资料,涵盖调试、性能分析和追踪的基础知识及常用工具。
284 6
Linux调试
|
2月前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
61 0
Linux 如何更改默认 Shell
|
3月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
97 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
4月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
4月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
897 2
|
3月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
53 0