【shell系列】之查看shell脚本的执行过程和makefile中调试手段

Date: 2018.10.16


前言

    在编写shell脚本或者makefile脚本时,运行成功往往需要经过一番调试,定位问题所在需要一些调试方法,本文旨在讲述makefile脚本或者shell脚本中的几种调试方法。

1、查看shell脚本中执行的每一条命令和变量值
sh -x shellscript
或者
sh -v shellscript

-x参数是显示过程

或者:
shell脚本中添加如下命令:

set -v   
或者:
#!/bin/bash -v
2、添加内置函数info, error或者warning打印信息
$(error $(LINK))  //打印变量LINK的值,并且编译报error
$(warning $(LINK)) //打印变量LINK的值,并且编译报warning
$(info string) //显示字符串string的值

$(warning string)函数可以放在makefile 中的任何地方,执行到该函数时,会将string输出,方便定位make执行到哪个位置。warning函数可以放在makefile 中的任何地方:开始的位置、工作目标或必要条件列表中以及命令脚本中。这让你能够在最方便查看变量的地方输出变量的值。
举个栗子:

ifeq($(PLATFORM),)
$(error $(PLATFORM) not defined! Please Check!)
endif

作用:检查变量是否有定义。这几个语句一般用于检查输入的变量是否有定义。

3、使用echo命令打印信息
 @echo "start the compilexxxxxxxxxxxxxxxxxxxxxxx"
 @echo $(LINK)
4、使用命令行选项进行调试分析

有时候,我们不想让我们的makefile中的规则执行起来,我们只想检查一下我们的命令,或是执行的序列。于是我们可以使用make命令的下述参数:

  • “-n” “–just-print” “–dry-run” “–recon” 不执行参数,这些参数只是打印命令,不管目标是否更新,把规则和连带规则下的命令打印出来,但不执行,这些参数对于我们调试makefile很有用处。

  • “-t” “–touch” 这个参数的意思就是把目标文件的时间更新,但不更改目标文件。也就是说,make假装编译目标,但不是真正的编译目标,只是把目标变成已编译过的状态。

  • “-q” “–question” 这个参数的行为是找目标的意思,也就是说,如果目标存在,那么其什么也不会输出,当然也不会执行编译,如果目标不存在,其会打印出一条出错信息。

  • “-W ;” “–what-if=;” “–assume-new=;” “–new-file=;” 这个参数需要指定一个文件。一般是是源文件(或依赖文件),Make会根据规则推导来运行依赖于这个文件的命令,一般来说,可以和“-n”参数一同使用,来查看这个依赖文件所发生的规则命令。

三个最适合用来调试的命令行选项:

(1). --just-print(-n)
这个选项被假设可以抑制所有命令的执行动作,然而这只在特定的状况下为真。实际上,你必须小心以对。尽管make不会运行命令脚本,但是在立即的语境之中,它会对shell函数调用进行求值动作。
在这里插入图片描述

正如我们之前所见,_MKDIRS 简单变量的目的是触发必要目录的创建动作。如果这个Makefile 是以–just-print 选项的方式运行的,那么当make 读进Makefile 时,shell命令将会一如往常般被执行。然后,make 将会输出(但不会执行)更新$(objects)文件列表所需要进行的每个编译命令。

(2). –print-database(-p)
–print-data-base(-p)是另一个你常会用到的选项。它会运行Makefile,显示GNU版权信息以及make 所运行的命令,然后输出它的内部数据库。数据库里的数据将会依种类划分成以下几个组:variables、directories、implicit rules、pattern-specific variables、files(explicit rules)以及vpath earch path。

(3). --warn-undefined-variables

这个选项会使得make 在未定义的变量被扩展时显示警告信息。

部分参考:
https://www.cnblogs.com/AP0904225/p/5936465.html


THE END!

原文地址:https://www.cnblogs.com/SoaringLee/p/10532332.html