青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0
strace命令用法

調用:
strace [ -dffhiqrtttTvxx ] [ -acolumn ] [ -eexpr ] ...
[ -ofile ] [ -ppid ] ... [ -sstrsize ] [ -uusername ] [ command [ arg ... ] ]

strace -c [ -eexpr ] ... [ -Ooverhead ] [ -Ssortby ] [ command [ arg ... ] ]
功能:
跟蹤程式執行時的系統調用和所接收的信號.通常的用法是strace執行一直到commande結束.
并且將所調用的系統調用的名稱、參數和返回值輸出到標準輸出或者輸出到-o指定的文件.
strace是一個功能強大的調試,分析診斷工具.你將發現他是一個極好的幫手在你要調試一個無法看到源碼或者源碼無法在編譯的程序.
你將輕松的學習到一個軟件是如何通過系統調用來實現他的功能的.而且作為一個程序設計師,你可以了解到在用戶態和內核態是如何通過系統調用和信號來實現程序的功能的.
strace的每一行輸出包括系統調用名稱,然后是參數和返回值.這個例子:
strace cat /dev/null
他的輸出會有:
open(\"/dev/null\",O_RDONLY) = 3
有錯誤產生時,一般會返回-1.所以會有錯誤標志和描述:
open(\"/foor/bar\",)_RDONLY) = -1 ENOENT (no such file or directory)
信號將輸出喂信號標志和信號的描述.跟蹤并中斷這個命令\"sleep 600\":
sigsuspend({}
--- SIGINT (Interrupt) ---
+++ killed by SIGINT +++
參數的輸出有些不一致.如shell命令中的 \">>tmp\",將輸出:
open(\"tmp\",O_WRONLY|O_APPEND|A_CREAT,0666) = 3
對于結構指針,將進行適當的顯示.如:\"ls -l /dev/null\":
lstat(\"/dev/null\",{st_mode=S_IFCHR|0666},st_rdev=makdev[1,3],...}) = 0
請注意\"struct stat\" 的聲明和這里的輸出.lstat的第一個參數是輸入參數,而第二個參數是向外傳值.
當你嘗試\"ls -l\" 一個不存在的文件時,會有:
lstat(/foot/ball\",0xb004) = -1 ENOENT (no such file or directory)
char*將作為C的字符串類型輸出.沒有字符串輸出時一般是char* 是一個轉義字符,只輸出字符串的長度.
當字符串過長是會使用\"...\"省略.如在\"ls -l\"會有一個gepwuid調用讀取password文件:
read(3,\"root::0:0:System Administrator:/\"...,1024) = 422
當參數是結構數組時,將按照簡單的指針和數組輸出如:
getgroups(4,[0,2,4,5]) = 4
關于bit作為參數的情形,也是使用方括號,并且用空格將每一項參數隔開.如:
sigprocmask(SIG_BLOCK,[CHLD TTOU],[]) = 0
這里第二個參數代表兩個信號SIGCHLD 和 SIGTTOU.如果bit型參數全部置位,則有如下的輸出:
sigprocmask(SIG_UNBLOCK,~[],NULL) = 0
這里第二個參數全部置位.

參數說明:
-c 統計每一系統調用的所執行的時間,次數和出錯的次數等.
-d 輸出strace關于標準錯誤的調試信息.
-f 跟蹤由fork調用所產生的子進程.
-ff 如果提供-o filename,則所有進程的跟蹤結果輸出到相應的filename.pid中,pid是各進程的進程號.
-F 嘗試跟蹤vfork調用.在-f時,vfork不被跟蹤.
-h 輸出簡要的幫助信息.
-i 輸出系統調用的入口指針.
-q 禁止輸出關于脫離的消息.
-r 打印出相對時間關于,,每一個系統調用.
-t 在輸出中的每一行前加上時間信息.
-tt 在輸出中的每一行前加上時間信息,微秒級.
-ttt 微秒級輸出,以秒了表示時間.
-T 顯示每一調用所耗的時間.
-v 輸出所有的系統調用.一些調用關于環境變量,狀態,輸入輸出等調用由于使用頻繁,默認不輸出.
-V 輸出strace的版本信息.
-x 以十六進制形式輸出非標準字符串
-xx 所有字符串以十六進制形式輸出.
-a column
設置返回值的輸出位置.默認為40.
-e expr
指定一個表達式,用來控制如何跟蹤.格式如下:
[qualifier=][!]value1[,value2]...
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用來限定的符號或數字.默認的qualifier是 trace.感嘆號是否定符號.例如:
-eopen等價于 -e trace=open,表示只跟蹤open調用.而-etrace!=open表示跟蹤除了open以外的其他調用.有兩個特殊的符號 all 和 none.
注意有些shell使用!來執行歷史記錄里的命令,所以要使用\\.
-e trace=set
只跟蹤指定的系統調用.例如:-e trace=open,close,rean,write表示只跟蹤這四個系統調用.默認的為set=all.
-e trace=file
只跟蹤有關文件操作的系統調用.
-e trace=process
只跟蹤有關進程控制的系統調用.
-e trace=network
跟蹤與網絡有關的所有系統調用.
-e strace=signal
跟蹤所有與系統信號有關的系統調用
-e trace=ipc
跟蹤所有與進程通訊有關的系統調用
-e abbrev=set
設定strace輸出的系統調用的結果集.-v 等與 abbrev=none.默認為abbrev=all.
-e raw=set
將指定的系統調用的參數以十六進制顯示.
-e signal=set
指定跟蹤的系統信號.默認為all.如signal=!SIGIO(或者signal=!io),表示不跟蹤SIGIO信號.
-e read=set
輸出從指定文件中讀出的數據.例如:
-e read=3,5
-e write=set
輸出寫入到指定文件中的數據.
-o filename
將strace的輸出寫入文件filename
-p pid
跟蹤指定的進程pid.
-s strsize
指定輸出的字符串的最大長度.默認為32.文件名一直全部輸出.
-u username
以username的UID和GID執行被跟蹤的命令.

 

 

用strace調試程序

         在理想世界里,每當一個程序不能正常執行一個功能時,它就會給出一個有用的錯誤提示,告訴你在足夠的改正錯誤的線索。但遺憾的是,我們不是生活在理想世界里,起碼不總是生活在理想世界里。有時候一個程序出現了問題,你無法找到原因。

    這就是調試程序出現的原因。strace是一個必不可少的調試工具,strace用來監視系統調用。你不僅可以調試一個新開始的程序,也可以調試一個已經在運行的程序(把strace綁定到一個已有的PID上面)。

    首先讓我們看一個真實的例子:

    [BOLD]啟動KDE時出現問題[/BOLD]

    前一段時間,我在啟動KDE的時候出了問題,KDE的錯誤信息無法給我任何有幫助的線索。

    代碼:

    _KDE_IceTransSocketCreateListener: failed to bind listener
    _KDE_IceTransSocketUNIXCreateListener: ...SocketCreateListener() failed
    _KDE_IceTransMakeAllCOTSServerListeners: failed to create listener for local

    Cannot establish any listening sockets DCOPServer self-test failed.


    對我來說這個錯誤信息沒有太多意義,只是一個對KDE來說至關重要的負責進程間通信的程序無法啟動。我還可以知道這個錯誤和ICE協議(Inter Client Exchange)有關,除此之外,我不知道什么是KDE啟動出錯的原因。

    我決定采用strace看一下在啟動dcopserver時到底程序做了什么:

    代碼:

    strace -f -F -o ~/dcop-strace.txt dcopserver


    這里 -f -F選項告訴strace同時跟蹤fork和vfork出來的進程,-o選項把所有strace輸出寫到~/dcop-strace.txt里面,dcopserver是要啟動和調試的程序。

    再次出現錯誤之后,我檢查了錯誤輸出文件dcop-strace.txt,文件里有很多系統調用的記錄。在程序運行出錯前的有關記錄如下:

    代碼:

    27207 mkdir("/tmp/.ICE-unix", 0777) = -1 EEXIST (File exists)
    27207 lstat64("/tmp/.ICE-unix", {st_mode=S_IFDIR|S_ISVTX|0755, st_size=4096, ...}) = 0
    27207 unlink("/tmp/.ICE-unix/dcop27207-1066844596") = -1 ENOENT (No such file or directory)
    27207 bind(3, {sin_family=AF_UNIX, path="/tmp/.ICE-unix/dcop27207-1066844596"}, 38) = -1 EACCES (Permission denied)
    27207 write(2, "_KDE_IceTrans", 13) = 13
    27207 write(2, "SocketCreateListener: failed to "..., 46) = 46
    27207 close(3) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13
    27207 write(2, "SocketUNIXCreateListener: ...Soc"..., 59) = 59
    27207 umask(0) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13
    27207 write(2, "MakeAllCOTSServerListeners: fail"..., 64) = 64
    27207 write(2, "Cannot establish any listening s"..., 39) = 39


    其 中第一行顯示程序試圖創建/tmp/.ICE-unix目錄,權限為0777,這個操作因為目錄已經存在而失敗了。第二個系統調用(lstat64)檢查 了目錄狀態,并顯示這個目錄的權限是0755,這里出現了第一個程序運行錯誤的線索:程序試圖創建屬性為0777的目錄,但是已經存在了一個屬性為 0755的目錄。第三個系統調用(unlink)試圖刪除一個文件,但是這個文件并不存在。這并不奇怪,因為這個操作只是試圖刪掉可能存在的老文件。

    但 是,第四行確認了錯誤所在。他試圖綁定到/tmp/.ICE-unix/dcop27207-1066844596,但是出現了拒絕訪問錯誤。. ICE_unix目錄的用戶和組都是root,并且只有所有者具有寫權限。一個非root用戶無法在這個目錄下面建立文件,如果把目錄屬性改成0777, 則前面的操作有可能可以執行,而這正是第一步錯誤出現時進行過的操作。

    所以我運行了chmod 0777 /tmp/.ICE-unix之后KDE就可以正常啟動了,問題解決了,用strace進行跟蹤調試只需要花很短的幾分鐘時間跟蹤程序運行,然后檢查并分析輸出文件。

    說 明:運行chmod 0777只是一個測試,一般不要把一個目錄設置成所有用戶可讀寫,同時不設置粘滯位(sticky bit)。給目錄設置粘滯位可以阻止一個用戶隨意刪除可寫目錄下面其他人的文件。一般你會發現/tmp目錄因為這個原因設置了粘滯位。KDE可以正常啟動 之后,運行chmod +t /tmp/.ICE-unix給.ICE_unix設置粘滯位。

    [BOLD]解決庫依賴問題[/BOLD]

    starce 的另一個用處是解決和動態庫相關的問題。當對一個可執行文件運行ldd時,它會告訴你程序使用的動態庫和找到動態庫的位置。但是如果你正在使用一個比較老 的glibc版本(2.2或更早),你可能會有一個有bug的ldd程序,它可能會報告在一個目錄下發現一個動態庫,但是真正運行程序時動態連接程序 (/lib/ld-linux.so.2)卻可能到另外一個目錄去找動態連接庫。這通常因為/etc/ld.so.conf和 /etc/ld.so.cache文件不一致,或者/etc/ld.so.cache被破壞。在glibc 2.3.2版本上這個錯誤不會出現,可能ld-linux的這個bug已經被解決了。

    盡管這樣,ldd并不能把所有程序依賴的動態庫列出 來,系統調用dlopen可以在需要的時候自動調入需要的動態庫,而這些庫可能不會被ldd列出來。作為glibc的一部分的NSS(Name Server Switch)庫就是一個典型的例子,NSS的一個作用就是告訴應用程序到哪里去尋找系統帳號數據庫。應用程序不會直接連接到NSS庫,glibc則會通 過dlopen自動調入NSS庫。如果這樣的庫偶然丟失,你不會被告知存在庫依賴問題,但這樣的程序就無法通過用戶名解析得到用戶ID了。讓我們看一個例 子:

    whoami程序會給出你自己的用戶名,這個程序在一些需要知道運行程序的真正用戶的腳本程序里面非常有用,whoami的一個示例輸出如下:
    代碼:

    # whoami
    root


    假設因為某種原因在升級glibc的過程中負責用戶名和用戶ID轉換的庫NSS丟失,我們可以通過把nss庫改名來模擬這個環境:
    代碼:

    # mv /lib/libnss_files.so.2 /lib/libnss_files.so.2.backup
    # whoami
    whoami: cannot find username for UID 0


    這里你可以看到,運行whoami時出現了錯誤,ldd程序的輸出不會提供有用的幫助:
    代碼:

    # ldd /usr/bin/whoami
    libc.so.6 => /lib/libc.so.6 (0x4001f000)
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)


    你只會看到whoami依賴Libc.so.6和ld-linux.so.2,它沒有給出運行whoami所必須的其他庫。這里時用strace跟蹤whoami時的輸出:
    代碼:

    strace -o whoami-strace.txt whoami

    open("/lib/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
    open("/lib/i686/mmx/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
    stat64("/lib/i686/mmx", 0xbffff190) = -1 ENOENT (No such file or directory)
    open("/lib/i686/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
    stat64("/lib/i686", 0xbffff190) = -1 ENOENT (No such file or directory)
    open("/lib/mmx/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
    stat64("/lib/mmx", 0xbffff190) = -1 ENOENT (No such file or directory)
    open("/lib/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
    stat64("/lib", {st_mode=S_IFDIR|0755, st_size=2352, ...}) = 0
    open("/usr/lib/i686/mmx/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
    stat64("/usr/lib/i686/mmx", 0xbffff190) = -1 ENOENT (No such file or directory)
    open("/usr/lib/i686/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)


    你可以發現在不同目錄下面查找libnss.so.2的嘗試,但是都失敗了。如果沒有strace這樣的工具,很難發現這個錯誤是由于缺少動態庫造成的。現在只需要找到libnss.so.2并把它放回到正確的位置就可以了。

    [BOLD]限制strace只跟蹤特定的系統調用[/BOLD]

    如果你已經知道你要找什么,你可以讓strace只跟蹤一些類型的系統調用。例如,你需要看看在configure腳本里面執行的程序,你需要監視的系統調用就是execve。讓strace只記錄execve的調用用這個命令:

    代碼:

    strace -f -o configure-strace.txt -e execve ./configure


    部分輸出結果為:
    代碼:

    2720 execve("/usr/bin/expr", ["expr", "a", ":", "(a)"], [/* 31 vars */]) = 0
    2725 execve("/bin/basename", ["basename", "./configure"], [/* 31 vars */]) = 0
    2726 execve("/bin/chmod", ["chmod", "+x", "conftest.sh"], [/* 31 vars */]) = 0
    2729 execve("/bin/rm", ["rm", "-f", "conftest.sh"], [/* 31 vars */]) = 0
    2731 execve("/usr/bin/expr", ["expr", "99", "+", "1"], [/* 31 vars */]) = 0
    2736 execve("/bin/ln", ["ln", "-s", "conf2693.file", "conf2693"], [/* 31 vars */]) = 0


    你 已經看到了,strace不僅可以被程序員使用,普通系統管理員和用戶也可以使用strace來調試系統錯誤。必須承認,strace的輸出不總是容易理 解,但是很多輸出對大多數人來說是不重要的。你會慢慢學會從大量輸出中找到你可能需要的信息,像權限錯誤,文件未找到之類的,那時strace就會成為一 個有力的工具了。
    from:
    http://blog.chinaunix.net/u1/55468/showart_2003061.html


posted on 2010-02-18 00:05 chatler 閱讀(516) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品成人在线视频| 欧美亚洲一级| 一区二区三区国产在线观看| 99亚洲视频| 欧美亚洲免费高清在线观看| 亚洲在线视频| 欧美中文在线免费| 欧美高清视频免费观看| 国产精品老女人精品视频| 精品动漫一区二区| 亚洲永久免费| 亚洲盗摄视频| 一区二区电影免费观看| 夜夜嗨av一区二区三区免费区| 亚洲欧美www| 欧美黄色大片网站| 亚洲欧美另类国产| 99国产精品国产精品久久| 国产精品免费视频观看| 两个人的视频www国产精品| 一本久道久久综合中文字幕| 美女精品国产| 黑丝一区二区三区| 久久国产一区二区三区| 一区二区三区四区五区视频| 老司机午夜精品| 在线观看日韩av| 久久久久九九九九| 午夜国产精品视频| 国产视频精品va久久久久久| 午夜精品一区二区三区电影天堂 | 亚洲综合日韩在线| 久久九九久精品国产免费直播| 欧美—级在线免费片| 亚洲国产精品va| 亚洲激情影视| 亚洲图片欧洲图片av| 欧美视频中文一区二区三区在线观看 | 亚洲第一福利社区| 欧美波霸影院| 久久综合网hezyo| 久久国产视频网站| 国产精品成人一区| 久久精品官网| 国产精品高潮呻吟久久| 亚洲精品系列| 欧美日韩在线播放| 亚洲欧美综合精品久久成人| 欧美.日韩.国产.一区.二区| 在线视频精品一区| 欧美激情导航| 亚洲欧洲一区二区三区| 亚洲国产日韩一区| avtt综合网| 一区二区三区视频在线播放| 欧美成人综合网站| 欧美一区二区三区男人的天堂| 欧美一区二区视频在线观看2020 | 亚洲精品在线一区二区| 亚洲美女中文字幕| 国产一区二区久久久| 男女激情视频一区| 亚洲国产高清在线| 久久综合一区二区| 亚洲高清不卡| 一区二区三区精品久久久| 欧美日韩国产综合网| 久久久久久亚洲精品不卡4k岛国| 欧美a级在线| 欧美激情亚洲国产| 国产日韩欧美综合| 欧美一区二区三区在线看| 久久亚洲私人国产精品va| 欧美黑人在线观看| 日韩天堂av| 欧美一级久久久| 国产一区二区三区久久久久久久久| 午夜综合激情| 一区二区av| 国产精品欧美久久久久无广告| 免费在线成人| 国产亚洲午夜| 欧美va天堂| 亚洲区一区二| 亚洲国产日韩一级| 欧美视频在线观看 亚洲欧| 午夜国产精品影院在线观看| 乱中年女人伦av一区二区| 99www免费人成精品| 麻豆乱码国产一区二区三区| 日韩视频免费看| 久久精品欧洲| 一区二区高清在线观看| 国产美女诱惑一区二区| 亚洲欧美一区在线| 欧美高清在线一区二区| 国产精品丝袜xxxxxxx| 久久爱91午夜羞羞| 亚洲男女自偷自拍| 国内精品视频666| 午夜激情亚洲| 亚洲国产成人porn| 久久经典综合| 一区二区三区久久久| 黄色免费成人| 欧美性色aⅴ视频一区日韩精品| 欧美成人一区二区| 午夜精品久久久久久久99黑人| 尤物九九久久国产精品的特点| 欧美日韩国产美女| 老鸭窝毛片一区二区三区| 亚洲午夜免费视频| 亚洲片国产一区一级在线观看| 久久久精品tv| 欧美在线www| 亚洲一二三区在线| 国产精品国产三级国产aⅴ浪潮 | 国产精品激情偷乱一区二区∴| 久久综合九色综合欧美就去吻| 亚洲在线观看视频网站| 亚洲麻豆一区| 亚洲国语精品自产拍在线观看| aa亚洲婷婷| 亚洲国产日韩在线一区模特| 国产日韩一区二区三区在线| 欧美性开放视频| 欧美天天综合网| 欧美日韩网址| 欧美日韩国产一区二区| 女人色偷偷aa久久天堂| 久久综合网络一区二区| 久久美女艺术照精彩视频福利播放| 欧美激情一区二区三区在线视频观看| 久久久久久高潮国产精品视| 午夜视频在线观看一区二区| 一区二区三区高清在线观看| 99国产精品99久久久久久| 亚洲免费观看| 国产一区二区三区免费不卡| 欧美极品影院| 久久在线播放| 欧美久久电影| 蜜桃久久av| 国产精品亚洲综合久久| 欧美一区二区日韩一区二区| 午夜精品福利一区二区蜜股av| 亚洲新中文字幕| 羞羞色国产精品| 欧美一级黄色录像| 久久久久久久一区| 亚洲精品一区二区三区福利| 亚洲精品免费一二三区| 亚洲精品一区二区三区不| 宅男精品视频| 欧美亚洲网站| 暖暖成人免费视频| 欧美日韩午夜在线视频| 国产精品久久久久久久久婷婷| 国产午夜精品一区二区三区欧美| 国产真实乱偷精品视频免| 亚洲国产高清在线| 亚洲午夜精品久久久久久app| 欧美在线1区| 亚洲高清资源| 亚洲天堂免费观看| 久久久久久久久综合| 欧美国产日本高清在线| 国产精品色网| 在线免费观看成人网| 一区二区三区欧美| 久久黄色网页| 日韩视频一区二区三区在线播放免费观看 | 香蕉久久夜色精品国产使用方法| 久久九九精品99国产精品| 欧美国产激情二区三区| 亚洲少妇在线| 免费亚洲电影| 国产视频亚洲精品| 日韩视频在线免费| 久久久一本精品99久久精品66| 亚洲国内精品在线| 久久精品人人做人人爽| 欧美视频一区在线| 亚洲第一精品在线| 久久精品99久久香蕉国产色戒| 亚洲国产精品123| 久久大综合网| 国产精品你懂的在线| 亚洲人成绝费网站色www| 亚洲激情二区| 久久久精品tv| 国产精品99久久久久久白浆小说| 蜜桃视频一区| 激情欧美一区二区三区在线观看| 亚洲欧美成人网| 亚洲美女在线一区| 欧美国产精品一区| 亚洲国产99精品国自产| 久久精品五月| 午夜欧美精品久久久久久久|