日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

跟蹤 UNIX 應(yīng)用程序的解決方案( 二 )


27unsigned long days_diff=0; 
(gdb) bt 
#0 calc_diff (day=26, month=3, year=2009) at ageindays.c:27 
#1 0x00001e3d in main (argc=3, argv=0xbffff708) at ageindays.c:89 
(gdb) p days_diff 
$1 = 8041 
(gdb)
通過 清單 2 中的輸出可以看出,我們打開了調(diào)試器,通過指定名稱在 calc_diff() 函數(shù)中設(shè)置了一個(gè)斷點(diǎn),然后在調(diào)試器中運(yùn)行程序,提供與命令行相同的參數(shù) 。
當(dāng)調(diào)試器到達(dá)創(chuàng)建的斷點(diǎn)時(shí),執(zhí)行過程停止,您可以檢查應(yīng)用程序代碼和調(diào)用的函數(shù) 。通過使用調(diào)試器,可以查看提供給函數(shù)的參數(shù)及其值(在這里是為目標(biāo)日期提供的日期信息) 。執(zhí)行停止之后,可以查看堆棧跟蹤,查看代碼中調(diào)用 calc_diff 函數(shù)的行,可以獲得 days_diff 變量的值 。因?yàn)閼?yīng)用程序的執(zhí)行過程已經(jīng)暫停了,所以還可以修改變量的值 。這樣就可以在應(yīng)用程序中嘗試使用不同的值,從而尋找潛在的問題 。
可以使用這些信息,因?yàn)槎x了特定的調(diào)試信息(組成函數(shù)和變量名的符號(hào))和其他元數(shù)據(jù)(比如定義函數(shù)的代碼行) 。
必須在編譯時(shí)把特定的調(diào)試信息添加到二進(jìn)制應(yīng)用程序中;更重要的是,必須訪問源代碼,才能把調(diào)試信息包含在編譯的應(yīng)用程序中 。如果無法識(shí)別函數(shù)名和變量,那么幾乎不可能調(diào)試程序 。
跟蹤與調(diào)試的對(duì)比
系統(tǒng)管理員(和開發(fā)人員)常常希望發(fā)現(xiàn)正在運(yùn)行的程序中的錯(cuò)誤 。例如,某個(gè)程序?yàn)槭裁丛斐闪似渌麊栴}(比如內(nèi)存和其他錯(cuò)誤),應(yīng)用程序的表現(xiàn)為什么不符合預(yù)期,它過去發(fā)生了什么情況 。在這種情況下,調(diào)試應(yīng)用程序的特定方面往往沒什么用 。需要查明的實(shí)際上是操作系統(tǒng)如何執(zhí)行應(yīng)用程序 。
在進(jìn)行調(diào)試時(shí),檢查的是應(yīng)用程序中定義的各個(gè)函數(shù)的執(zhí)行過程 。調(diào)試主要關(guān)注應(yīng)用程序本身,包括其中的函數(shù)和結(jié)構(gòu),通常會(huì)忽視應(yīng)用程序向操作系統(tǒng)發(fā)出的系統(tǒng)調(diào)用和庫函數(shù)調(diào)用 。調(diào)試能夠提供關(guān)于應(yīng)用程序的大量信息,但是對(duì)于了解操作系統(tǒng)如何執(zhí)行應(yīng)用程序幫助不大 。
在進(jìn)行跟蹤時(shí),監(jiān)視應(yīng)用程序和操作系統(tǒng)之間的交互,常常會(huì)檢查應(yīng)用程序在執(zhí)行期間調(diào)用的操作系統(tǒng)函數(shù) 。
除了這些差異之外,跟蹤和調(diào)試之間的主要差異是,跟蹤不要求訪問源代碼,也不要求以任何特殊方式編譯應(yīng)用程序 。這意味著可以跟蹤操作系統(tǒng)附帶的或第三方廠商提供的應(yīng)用程序 。
通過跟蹤應(yīng)用程序,可以查明以下方面的情況:
內(nèi)存使用量和映射內(nèi)存的調(diào)用
在執(zhí)行期間打開和關(guān)閉的文件
對(duì)不同文件的讀和寫操作
為給定的應(yīng)用程序裝載的庫
下面先研究一下 truss 的輸出,truss 是一種可以在 Solaris 和 AIX?上使用的工具 。
使用 truss 和 strace
在 Solaris 和 AIX 上可以使用 truss 工具,它能夠跟蹤應(yīng)用程序中的系統(tǒng)調(diào)用和信號(hào) 。可以在 Linux?上使用的 strace 工具提供相似的功能 。在不同的系統(tǒng)上,還有提供相似信息的其他工具,包括 ktrace (FreeBSD) 和 trace 。
truss/strace 概述
truss 和 strace 工具提供相似的信息,但是命令行選項(xiàng)稍有差異 。使用這兩種工具的標(biāo)準(zhǔn)方法都是把工具名放在要執(zhí)行的命令前面 。
例如,清單 3 給出 truss 對(duì)于本教程前面提到的 ageindays 程序的輸出 。
清單 3. truss 的輸出
$ truss ./ageindays 24/1/1980 26/3/2009 
execve("ageindays", 0x08047BBC, 0x08047BCC) argc = 3 
mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0) 
= 0xFEFB0000 
resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12 

推薦閱讀