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