歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix基礎知識 >> 動態跟蹤工具

動態跟蹤工具

日期:2017/2/25 10:12:40   编辑:Unix基礎知識

簡介

如果在非生產環境中無法重現問題,就必須在生產環境中應用各種問題判斷技術,以尋找問題的根源,同時不能影響生產系統的性能和穩定性。

在不同的 UNIX® 平台上有不同的工具和技術,但是這些並不都能夠用來診斷生產系統中的問題,因為其中一些會造成性能和穩定性問題。

Solaris 和 AIX 平台都提供用於診斷生產系統問題的動態跟蹤工具。

Solaris 上的 Dtrace 動態跟蹤工具

Dtrace 是在 Solaris 10 中引入的動態跟蹤工具,這種調試工具可以調試用傳統的問題判斷機制難以診斷的問題。

Dtrace 讓用戶能夠動態地修改操作系統內核和用戶進程,從而記錄額外數據。管理員和開發人員可以使用記錄的數據研究應用程序和操作系統,尋找正在運行的系統的異常行為的原因。

術語

探測(Probe):內核或應用程序中用戶感興趣的位置,需要記錄來自這些地方的數據。
提供者(Provider):執行創建探測所需的操作的內核模塊。
斷言(Predicate):修改控制流的邏輯表達式,可以有條件地跟蹤數據。
D 語言

Dtrace 動態跟蹤工具使用 D 語言,用戶可以使用 D 語言把動作與探測點關聯起來,以及指定什麼時候觸發探測和在觸發時記錄哪些數據。dtrace 命令解釋使用 D 語言編寫的腳本。

這種語言支持與 C 語言相似的數據對象,比如 integer、char、short、long 等等。它還提供 ANSI-C 操作符的子集,可以用來操作數據對象。

D 語言結構

下面的示例說明 D 語言的結構:

probe1
/ predicate /
{
action
}
probe2
/ predicate /
{
action
}
D 語言結構由一個或多個探測子句組成。每個子句指定在滿足斷言條件的情況下探測要執行的動作。動作和斷言是可選的。

可以重定向輸出並使用腳本解析輸出,檢查應用程序是否有未釋放的已分配內存。malloc.d 腳本捕捉應用程序執行的所有 malloc 調用。另外,通過在前面的 D 腳本中的進入探測中添加 ustack() 函數,可以顯示 malloc 調用的堆棧跟蹤,這有助於識別造成洩露的代碼位置。

這個示例使用 PID 提供者。PID 探測提供者的名稱形式為字符串 ‘pid’ 加上進程 ID。因此,對於進程 1234,PID 提供者為 pid1234。

arg0 是傳遞給要探測的函數的參數,用於進入探測。

arg1 是要探測的函數的返回值,用於退出探測。

在 malloc.d 腳本中,在運行時把 $target 替換為應用程序 myapp 的進程 ID。

如果用戶需要跟蹤某個用戶函數中的 malloc 和 free 調用,那麼可以按以下方式修改 malloc.d 腳本。如果在探測指定語句中沒有指定模塊部分,探測就應用於與這個應用程序鏈接的所有模塊。

pid$target::functionXX:entry
{
traceflag=1;
}
pid$target::functionXX:return
{
traceflag=0;
}
pid$target::malloc:entry
/traceflag != 0/
{
printf("malloc: PID %d requested %d bytes\n",$target,arg0);
}
pid$target::malloc:return
/traceflag != 0/
{
printf("malloc: PID %d returned address 0X%x\n",$target,arg1);
}
pid$target::free:entry
/traceflag != 0/
{
printf("free: PID %d freeing address 0X%x \n",$target,arg0);
}

場景 2

在中間件環境中(例如 WebSphere® 或 TXSeries®),應用程序的業務邏輯在應用服務器上運行。在這種復雜的環境中,運行應用程序的客戶常常抱怨響應時間太長。為了找到性能瓶頸,必須了解在為最終用戶請求服務的過程中應用程序所交互的軟件花費的時間。

中間件軟件作為駐留應用程序的環境,可以提供跟蹤不同軟件組合花費的時間所需的代碼。但是,這會產生比較大的開銷。

可以使用 dtrace 了解這方面的信息,這不會影響性能,也不需要修改應用程序或中間件軟件。可以使用它跟蹤各個軟件模塊的進入和退出時間戳,從而收窄導致性能瓶頸的軟件范圍。

例如,如果一個應用程序與 DB2® 數據庫交互,用戶發現它的響應很慢,那麼可以編寫一個 D 腳本,跟蹤應用程序內花費的時間和執行數據庫操作花費的時間。

可以使用下面這樣的 D 腳本完成這個任務:

pid$target::sqlastrt:entry
{
self->time=timestamp;
}
pid$target::sqlastop:entry
/self->time != 0/
{
printf("Time spent in sql call %d nsecs\n",timestamp - self->time);
self->time=0;
}
這裡的 self 標識符聲明一個線程局部變量 time。應用程序中的每個線程都有自己的局部變量 time,因此每個應用程序線程可以跟蹤自己的時間。
AIX ProbeVue 使用示例

下面的探測腳本使用用戶函數進入探測跟蹤 malloc 例程,顯示分配的內存量。

#!/usr/bin/probevue
char * malloc(int size);
@@uft:$1:*:malloc:entry
{
printf("malloc(%d)\n",__arg1);
}

調用這個腳本,傳遞希望跟蹤其 malloc 調用的進程的進程 ID。

__arg1、__arg2、__arg3 等是內置的進入類變量,它們引用傳遞給函數的參數。$1 替換為傳遞給腳本的進程 ID。

#malloc.d

要想查看 malloc 調用的調用堆棧,可以在前面的腳本中調用 stktrace() 探測函數。

Copyright © Linux教程網 All Rights Reserved