使用truss命令定位應用程式執行問題的案例

2021-09-01 06:05:33 字數 2801 閱讀 7238

1、問題描述

執行應用程式時出現core dump,程式無法啟動;應用程式在執行過程中掛起,沒有任何輸出;應用程式執行出錯,但錯誤資訊不足以明確判斷錯誤原因。且應用程式日誌無法提供任何有用的幫助。

2、解決方案

可以使用aix 5l 的truss命令來檢視應用程式的執行行為。當應用程式沒有按預期的方式工作時,通常優先的求助方法是檢查應用程式和系統日誌。但是,當日誌無法提供有用幫助時,可以用truss命令對應用程式的執行進行跟蹤。有了這些跟蹤資訊和對aix的基本認識,就可以輕鬆定位應用程式執行中的問題了。

truss命令顯示了應用程式對外部庫和核心的呼叫情況。應用程式一般使用這些呼叫來訪問網路、檔案系統以及顯示資訊。通過觀察這些呼叫及其結果,可以了解應用程式需要什麼,並由此找到解決方案。

以下通過乙個ftp應用程式的執行許可權問題來闡述truss命令的作用:

在進行ftp操作時,只有root使用者能正常執行ftp命令,系統顯示ftp提示資訊。普通使用者執行ftp命令時直接退出,且無任何錯誤資訊顯示。使用truss命令對ftp應用程式進行跟蹤:

# truss ftp xx.xx.xx.xx

輸出結果如下:

execve("/usr/bin/ftp", 0x2ff22b74, 0x2ff22b80) argc: 2

__loadx(0x03020000, 0x2ff22a30, 0x00000090, 0xdeadbeef, 0xdeadbeef) = 0x00000000

__loadx(0x0a040000, 0xd036915c, 0x5f5f5f62, 0x5f5f7274, 0x00000000) = 0x00000000

。。。getgidx(1) = 202

__loadx(0x01000080, 0x2ff1e450, 0x00003e80, 0x2ff223e0, 0x00000000) = 0xd007f130

access("/usr/lib/nls/msg/en_us/ftp.cat", 0) = 0

_getpid() = 569576

socket(1, 2, 0) = 3

kfcntl(3, f_setfd, 0x00000001) = 0

connext(3, 0xf0383d5c, 16) = 0

auditproc(0, 4, "", 0) err#1 eperm

_getpid() = 569576

access("/usr/lib/nls/msg/en_us/libc.cat", 0) = 0

_getpid() = 569576

open("/usr/lib/nls/msg/en_us/libc.cat", o_rdonly) = 4

kioctl(4, 22528, 0x00000000, 0x00000000) err#25 enotty

kfcntl(4, f_setfd, 0x00000001) = 0

kioctl(4, 22528, 0x00000000, 0x00000000) err#25 enotty

kread(4, "\0\001 鵟007\007 i s o 8".., 4096) = 4096

lseek(4, 0, 1) = 4096

lseek(4, 0, 1) = 4096

lseek(4, 0, 1) = 4096

_getpid() = 569576

lseek(4, 0, 1) = 4096

close(4) = 0

open("/dev/null", o_wronly|o_creat|o_trunc) = 4

kioctl(4, 22528, 0x00000000, 0x00000000) err#19 enodev

kioctl(4, 22528, 0x00000000, 0x00000000) err#19 enodev

kwrite(4, " f t p : a u d i t p r".., 41) = 41

close(4) = 0

send(3, 0x2ff21d54, 73, 0) = 73

__loadx(0x04000000, 0x2ff20520, 0x00002000, 0xf03de8b0, 0x00000000) = 0x00000000

kfcntl(1, f_getfl, 0x00000001) = 2

kfcntl(2, f_getfl, 0x00000000) = 2

_exit(1)

輸出中的每一行表示了應用程式進行的乙個函式呼叫,並且在合適的情況下,還顯示了其返回值。要查詢潛在導致該問題的呼叫,最簡單的方法通常是從最末尾處開始。向上滾動錯誤訊息可以發現,第乙個錯誤出現在auditproc(0, 4, "", 0)行,該行返回了錯誤 err#1 eperm。檢視auditproc()函式的返回碼,eperm的錯誤含義是函式呼叫者沒有root使用者的許可權。很明顯,該函式是要查詢或設定程序的審計狀態,但執行時需要有root使用者的許可權。返回值eperm意味著該問題與許可權有關。因為在正常情況下普通使用者是可以使用ftp應用的,所以這可能與ftp應用程式的set-uid屬性有關。檢查ftp應用程式的許可權時發現,當前ftp應用程式的許可權是-r-xr-xr-x,而正常的ftp應用程式的許可權是-r-sr-xr-x。使用chmod u+s ftp命令更改許可權後,普通使用者就可以正常執行ftp應用程式了。

總之,能夠檢視跟蹤應用程式的執行行為是排除程序故障的有效手段。當常規的問題解決方法失效時,可以進行應用程式跟蹤。通過跟蹤定位應用程式執行中的問題的一般方法是:

 描述問題。

 跟蹤應用程式。

 從出現問題的地方著手,逆向檢查系統呼叫以確定該問題。使用其他途徑來獲取關於這些系統呼叫的解釋。

 更正應用程式的行為並進行測試。

使用adb命令來查詢應用程式入口

adb常用命令 1.或者鏈結的裝置資訊 獲取啟動的任務 adb logcat findstr i displayed 啟動的方法為 adb shell am start n 包 package 名 包名 但是很遺憾,啟動chrome失敗了。再次啟動簡訊,結果又成功了。抓到的第乙個activity才是...

使用應用程式域程式設計

以前使用程序邊界來隔離在同一臺計算機上執行的應用程式。每乙個應用程式被載入到單獨的程序中,這樣就將該應用程式與在同一臺計算機上執行的其他應用程式相隔離。隔離這些應用程式的原因在於記憶體位址是與程序相關的 在目標程序中,不能通過任何有意義的方式使用從乙個程序傳遞到另乙個程序的記憶體指標。此外,您不能在...

使用Moblin SDK開發應用程式

從這篇開始,我會逐步介紹moblin2 sdk中引入的api與中介軟體,希望能對大家有所幫助。在詳細介紹之前,先講講geoclue的來龍去脈。大家知道,原先在應用程式中要獲取裝置的當前位置,最常見的做法是通過gps定位,程式設計師往往需要直接訪問串列埠讀取gps裝置發來的nmea幀,然後通過分析獲得...