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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM