• 【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!

  • 相关阅读:
    linux学习之linux的hostname修改详解《转》
    不想作死系列--win7远程linux桌面之vncserver
    不想作死系列---virtualbox最小化安装centos6.5
    基于支持向量机的车牌识别-- opencv2.4.7+vs2012环境搭建
    python文件的中文处理以及个人思路
    haskell学习笔记<1>--基本语法
    提醒
    C语言矩阵传递给函数的方法
    0x01数据结构——C语言实现(二叉查找树)
    0x01数据结构——C语言实现(二叉树)
  • 原文地址:https://www.cnblogs.com/SoaringLee/p/10532332.html
Copyright © 2020-2023  润新知