trace --- 追蹤或追查 Python 陳述式執行

原始碼:Lib/trace.py


trace 模組可用來追蹤程式執行過程、產生帶註解的陳述式涵蓋範圍清單、輸出呼叫者/被呼叫者的關係,以及在程式執行期間被執行的函式串列。它可以在其他程式中使用,也可以從命令列啟動。

也參考

Coverage.py

一款受歡迎的第三方涵蓋範圍工具,提供 HTML 輸出與分支涵蓋等進階功能。

命令列用法

trace 模組可從命令列執行,用法可以非常簡單,如::

python-mtrace--count-C.somefile.py...

上述命令會執行somefile.py,並將產生執行期間所引入的所有 Python 模組的帶註解串列,輸出至目前目錄。

--help

顯示用法並結束程式。

--version

顯示模組版本並結束程式。

在 3.8 版被加入:新增--module 選項,允許執行可執行模組。

主要選項

執行trace 時,至少必須指定以下選項之一。--listfuncs 選項與--trace--count 選項互斥。當提供--listfuncs 時,將不接受--count--trace,反之亦然。

-c,--count

在程式執行結束時產生一組帶註解串列檔案,顯示每個陳述式被執行的次數。參見下方的--coverdir--file--no-report

-t,--trace

執行時即時顯示每一行。

-l,--listfuncs

顯示程式執行過程中被呼叫的函式。

-r,--report

從先前使用--count--file 選項執行過的程式生成帶註解的串列,不會執行任何程式碼。

-T,--trackcalls

顯示程式執行時產生的呼叫關係。

修飾子(Modifier)

-f,--file=<file>

指定用來累積多次追蹤結果的檔案之名稱。應與--count 選項搭配使用。

-C,--coverdir=<dir>

報告檔案的輸出目錄。package.module 的涵蓋範圍報告將寫入檔案:dir/package/module.cover

-m,--missing

在產生帶註解的串列時,使用>>>>>> 標記未被執行的程式碼行。

-s,--summary

使用--count--report 時,會將每個處理過的檔案摘要輸出至 stdout。

-R,--no-report

不產生帶註解的串列。若你打算多次使用--count 執行程式,並在最後再統一產生串列,這會很有幫助。

-g,--timing

在每一行前加上自程式啟動以來的經過時間。僅在追蹤時使用。

篩選子(Filter)

這些選項可以重複使用多次。

--ignore-module=<mod>

忽略所指定的模組名稱及其子模組(若為套件)。引數可以是以逗號分隔的名稱串列。

--ignore-dir=<dir>

忽略指定目錄及其子目錄中的所有模組與套件。引數可以是以os.pathsep 分隔的目錄串列。

程式介面

classtrace.Trace(count=1,trace=1,countfuncs=0,countcallers=0,ignoremods=(),ignoredirs=(),infile=None,outfile=None,timing=False)

建立一個物件以追蹤單一陳述式或運算式的執行。所有參數皆為可選的。count 啟用行數統計,trace 啟用逐行追蹤執行,countfuncs 可列出執行期間呼叫的函式,countcallers 追蹤呼叫關係,ignoremods 是要忽略的模組或套件名稱串列,ignoredirs 是其模組或套件應被忽略的目錄串列,infile 是讀取儲存計數資料的檔案名稱,outfile 是要寫入更新後計數資料的檔案名稱,timing 則會顯示自開始追蹤以來的時間戳記。

run(cmd)

執行命令,並依目前追蹤參數收集執行統計資料。cmd 必須是可傳入exec() 的字串或程式碼物件。

runctx(cmd,globals=None,locals=None)

在指定的全域與區域命名空間中,根據目前的追蹤參數執行命令並收集統計資料。若未指定,globalslocals 預設為空字典。

runfunc(func,/,*args,**kwds)

在目前的追蹤參數下,使用Trace 物件控制呼叫func,並傳入指定的引數。

results()

回傳一個CoverageResults 物件,包含指定Trace 實例中所有先前對runrunctxrunfunc 呼叫的累積結果。不會重設累積的追蹤結果。

classtrace.CoverageResults

一個用來儲存涵蓋範圍結果的容器,由Trace.results() 建立。不應由使用者直接建立。

update(other)

合併來自另一個CoverageResults 物件的資料。

write_results(show_missing=True,summary=False,coverdir=None,*,ignore_missing_files=False)

寫入涵蓋範圍結果。將show_missing 設為真可顯示未被執行的程式碼行;將summary 設為真則會在輸出中加入每個模組的涵蓋範圍摘要。coverdir 指定輸出涵蓋範圍結果檔案的目錄,若為None,則每個原始檔案的結果會輸出至其所在目錄中。

ignore_missing_filesTrue,則會忽略那些已不存在的檔案的涵蓋範圍資料,不會顯示任何錯誤。否則,缺少的檔案將會引發FileNotFoundError

在 3.13 版的變更:新增ignore_missing_files 參數。

以下是一個簡單範例,展示如何使用程式介面:

importsysimporttrace# 建立一個 Trace 物件,指定要忽略的目錄,# 並設定是否進行追蹤、行數統計或兩者皆做。tracer=trace.Trace(ignoredirs=[sys.prefix,sys.exec_prefix],trace=0,count=1)# 使用該 tracer 執行新的命令tracer.run('main()')# 建立報告,將輸出放在目前目錄中r=tracer.results()r.write_results(show_missing=True,coverdir=".")