BASH 的调试手段

echo/print (普通技)

打印一些变量,或者提示信息。这应该是一个通用的方法了。在 BASH 里,我们可以简单的用 echo,或者 print 来输出一些 log,或者加一些 loglevel 来过滤一些 log。这里贴一下我平常用的函数:

_loglevel=2

DIE() {

echo "Critical: $1>" >&2

exit 1

}

INFO() {

[ $_loglevel -ge 2 ] && echo "INFO: $1>" >&2

}

ERROR() {

[ $_loglevel -ge 1 ] && echo "ERROR: $1>" >&2

}

这里的实现只是简单的加了一个 loglevel,其实可以把 log 输出到一个文件中,或者给 log 加上颜色。比如:

# add color

[ $_loglevel -ge 1 ] && echo -e "\033[31m ERROR:\033[0m $1>" >&2

# redirect to file

[ $_loglevel -ge 1 ] && echo "ERROR: $1>" > /var/log/xxx_log.$BASHPID

set -x (稀有技)

-x(xtrace) 选项会导致 BASH 在执行命令之前,先把要执行的命令打印出来。这个选项对调试一些命令错误很有帮助。

有的时候,由于传进来的参数带有一些特殊字符,导致 BASH 解析时不是按照我们预想的进行。这个时候,把 -x 打开,就能在命令执行前,把扩展后的命令打印出来。比如基于前面写的函数:

set -x

INFO "this is a info log>"

ERROR "this is a error log>"

set +x

如果想全程打开 xtrace,可以在执行脚本的时候加 -x参数。

trap/bashdb (史诗技)

为了方便调试,BASH 也提供了陷阱机制。这跟之前介绍的两种方法高级不少。我们可以利用 trap 这个内置命令来指定各个 sigspec 应该执行的命令。trap 的具体用法如下:

trap [-lp] [[arg] sigspec ...]

sigspec 包括 中定义的各个 signal, EXIT,ERR,RETURN 和 DEBUG。

各个 signal 这里就不介绍了。EXIT 会在 shell 退出时执行指定的命令。若当前 shell 中有命令执行返回非零值,则会执行与 ERR 相关联的命令。而 RETURN 是针对 source和 .,每次执行都会触发 RETURN 陷阱。若绑定一个命令到 DEBUG,则会在每一个命令执行之前,都会先执行 DEBUG 这个 trap。这里要注意的是,ERR 和 DEBUG 只在当前 shell 有效。若想函数和子 shell 自动继承这些 trap,则可以设置 -T(DEBUG/RETURN) 和 -E(ERR)。

比如,下面的脚本会在退出时,执行echo:

#!/bin/bash

trap "echo this is a exit echo>" EXIT

echo "this is a normal echo>"

或者,让脚本中命令出错时,把相应的命令打印出来:

#!/bin/bash

trap ‘echo $BASH_COMMAND return err‘ ERR

echo this is a normal test

UnknownCmd

亦或者,让脚本的命令单步执行:

#!/bin/bash

trap ‘(read -p "[$0 : $LINENO] $BASH_COMMAND ?>")‘ DEBUG

echo this is a test

i=0

while [ true ]

do

echo $i

((i++))

done

时间: 2024-10-13 11:52:44

BASH 的调试手段的相关文章

BASH 的调试技巧

平时在写 BASH 脚本时,总是会碰到让人抓狂的 BUG.和 C/C++ 这么丰富的调试工具相比,BASH 又有什么调试手段呢? 1 echo/print (普通技) 打印一些变量,或者提示信息.这应该是一个通用的方法了.在 BASH 里,我们可以简单的用 echo,或者 print 来输出一些 log,或者加一些 loglevel 来过滤一些 log.这里贴一下我平常用的函数: _loglevel=2 DIE() { echo "Critical: $1" >&2 ex

Android下的一些调试手段(含kernel调试办法)

主要介绍除了常规的kernel的printk和android的DDMS, logcat外的几个调试手段. 包括bugreport, oprofile, traceview, ftrace等. Bugreport Bugreport是android平台自带的工具, 收集了device端的详细的状况, 可以在console下直接运行"bugreport > /sdcard/bugreport.log"或者接入USB cable并打开adb debug的状况下运行"adb b

thinkphp调试手段

使用ThinkPHP应该掌握的调试手段经常看到有人问到findAll的返回数据类型是什么之类的问题,以及出错了不知道什么原因的情况,其实还是没有熟悉ThinkPHP内置的调试手段和方法,抛开IDE本身自带的调试方式不说,如果你正在用或者打算用ThinkPHP开发的话,那么下面一些和调试相关的方法你是应该要了解和掌握的: 1.在项目配置文件里面打开调试模式DEBUG_MODE,这样能够让你发现大部分的错误原因 .可能影响验证码的输出.2.如果不想使用调试模式,可以单独开启页面Trace显示.发现很

常用性能调试手段

在开发过程中经常会出现这样那样的性能问题,让人很纠结,下面我会列举一些常用的性能调试手段来找出对应的性能问题的原因 一.CPU过高这是最常发生的让人很纠结的问题,CPU 100%了 ,但到底是什么引发的呢?使用Jprofiler之类的工具可以查看CPU问题,能列出CPU具体堆栈,但是有个问题是Jprofiler本身会占用很高的CPU,用Jprofiler来查看CPU问题的时候会很不靠谱.下面介绍一些比较简单的查看CPU高的方法.首先来看哪些线程占用了最多的CPU(1)ps  -eLo pid,l

shell 调试手段总结

对于厌烦了的 print 和 echo,可以尝试点新鲜省力的小手段. 1. 使用 shell 的执行选项 sh 和 bash 常用的执行指令有:-n.-x.-c.-v. 其中: -n 是 noexec 的简写,作用是只做脚本的语法检查,而不执行脚本. -x 是 xtrace 的简写,作用是在每一行代码执行之前,将代码本身打印到标准输出(代码前添加一个 “+” 用来区别).这个在调试的时候尤其有用. -c 是 command string 的缩写,使用该选项从字符串而不是文件读取脚本.比如,sh

PHP后台之调试手段(新手必备)

作为一个刚刚接触世界上最好的语言php的新手,前端js可以直接console.log调试,在调试后端rpc的类半天找不到打印输出的方法,普通的print和echo既不能输出到页面也不能输出到文件,痛苦了半天,从网上搜罗了一下亲测好用的语句. //输出变量或数组到文件 $fp = fopen('./a.txt', 'a+b'); fwrite($fp, print_r($content, true)); fclose($fp); //打印单个变量到文件 error_log($file, 3, "/

高级性能调试手段(oprofile+gprofile)+内核追踪手段:LTT

yum install oprofile 1.Disabling daemons (关闭 daemons)‏ 2.Shutting down the GUI (关闭GUI)‏ 3.Changing kernel parameters (改变内核参数) 4.Kernel parameters (内核参数) 5.Tuning the processor subsystem(处理器子系统调优) 6.Tuning the memory subsystem (内存子系统调优) 7.Tuning the f

【转】shell脚本调试(bash trap support bashdb )

原文网址:http://zhu8337797.blog.163.com/blog/static/170617549201122512712136/ 命 令 选 项 功 能 bash –x 脚本名 回显 在变量替换之后.执行命令之前,显示脚本的每一行 bash –v 脚本名 详细 在执行之前,按输入的原样打印脚本中各行 bash –n 脚本名 不执行 解释但不执行命令 set –x 打开回显 跟踪脚本的执行 set +x 关闭回显 关闭跟踪功能 --------------------------

SylixOS异常调试的手段

1 适用范围 本文档适用于希望了解当前SylixOS的调试手段的工程师.2 cdump 系统/应用异常调试手段 2.1 cdump简介 cdump 是SylixOS系统下的shell命令,用于系统/应用崩溃的信息记录.cdump可以将内核保存在堆中的异常信息显示出来并清空内核堆中的异常信息或者保存下来. 2.2 cdump的使用方法 当系统/应用程序发生异常时,可以在系统命令行下输入 cdump -s 保存异常信息,异常信息将保存在/var/log/cdump/ 目录下,如图 2.1. [点击并