調(diào)試的定義:通過(guò)一定方法,在程序中找到并減少缺陷的數(shù)量,從而使其能正常工作。
1、自帶的報(bào)錯(cuò)功能 兩個(gè)名詞:開(kāi)發(fā)環(huán)境是開(kāi)發(fā)人員在進(jìn)行開(kāi)發(fā)和調(diào)試的環(huán)境,生產(chǎn)環(huán)境是最終客戶在用的線上環(huán)境; (1)開(kāi)發(fā)環(huán)境
這樣你在開(kāi)發(fā)過(guò)程中,能第一時(shí)間發(fā)現(xiàn)錯(cuò)誤。 即使是一個(gè)低等級(jí)的報(bào)錯(cuò)“Notice: Undefined variable: a in E:\phpspace\test.php on line 14”,但一個(gè)未定義的變量的使用往往暗藏著bug。 你會(huì)問(wèn),如果我引進(jìn)了開(kāi)源的類庫(kù),他們拋出一堆的低等級(jí)錯(cuò)誤怎么辦?一般代碼質(zhì)量好的類庫(kù),也沒(méi)有“Notice”級(jí)別的報(bào)錯(cuò)的。所以這也是鑒別一個(gè)類庫(kù)質(zhì)量的方法。 (2)生產(chǎn)環(huán)境 生產(chǎn)環(huán)境不能直接將錯(cuò)誤輸出,而是記入日志,以下是php.ini的配置項(xiàng)及其說(shuō)明:
當(dāng)然日志寫到文件里只是一個(gè)選擇,還有其他配置可參考手冊(cè)。 生產(chǎn)環(huán)境是給客戶提供服務(wù)的,你不可能在上面進(jìn)行斷點(diǎn)、打印輸出等操作,所以日志是不錯(cuò)的選擇。 2、其他一些語(yǔ)言特性、功能的使用 (1)少用錯(cuò)誤控制運(yùn)算符“@” 其的作用是,將“@”放置在一個(gè)PHP表達(dá)式之前,該表達(dá)式可能產(chǎn)生的任何錯(cuò)誤信息都被忽略掉。 如果一個(gè)缺陷發(fā)生在這個(gè)表達(dá)式中,從PHP的輸出中看不到任何錯(cuò)誤,這增加了調(diào)試的難度。所以能不用則不用。 (2)有些函數(shù)自帶有debug功能 比如這行代碼:
開(kāi)發(fā)者調(diào)試時(shí)已經(jīng)確定,$fp為空,連接失敗,是這一行有問(wèn)題,但是為什么連接失敗? 函數(shù)是php自帶的,無(wú)法進(jìn)行更深入的調(diào)試。所以一般這樣的函數(shù)(主要是網(wǎng)絡(luò)通信類的),會(huì)自己提供調(diào)試參數(shù):$errno和$errstr。你可以加一句:
就能看到連接失敗的原因了。 這些函數(shù)有:fsockopen,pfsockopen,stream_socket_server,stream_socket_client 等。 還有些函數(shù)是調(diào)試一個(gè)功能用的,比如:mysql_errno,socket_last_error,socket_strerror 等。 這些只需要了解下,碰到能想到用即可。 在遇到復(fù)雜問(wèn)題時(shí),可以借助調(diào)試工具。比較成熟的有Xdebug、ZendDebugger。 以Xdebug為例,它能夠:控制打印輸出的樣式和數(shù)組層級(jí)、堆棧式的追蹤錯(cuò)誤、追蹤函數(shù)調(diào)用、代碼執(zhí)行覆蓋分析、程序的概要分析(Profiling)、遠(yuǎn)程調(diào)試。詳見(jiàn):http:///docs/。 Xdebug前兩個(gè)功能是對(duì)PHP原有的調(diào)試功能做了改進(jìn),更方便調(diào)試。 復(fù)雜的問(wèn)題,調(diào)試不出來(lái)的,可能是業(yè)務(wù)上的的問(wèn)題,下面也有說(shuō)業(yè)務(wù)邏輯的調(diào)試。 當(dāng)PHP腳本跑起來(lái),沒(méi)有任何錯(cuò)誤,只能說(shuō)它沒(méi)有語(yǔ)法上的錯(cuò)誤,但是不能說(shuō)明它業(yè)務(wù)邏輯上沒(méi)錯(cuò)誤。 很多業(yè)務(wù)邏輯的錯(cuò)誤并不會(huì)反映在語(yǔ)法錯(cuò)誤上,但調(diào)試的思路和PHP自帶調(diào)試功能差不多。 下面是一些方法。 1、最基本的調(diào)試方法 先確定兩個(gè)東西:程序預(yù)期的結(jié)果、程序現(xiàn)在的不符合預(yù)期的結(jié)果; 你也可以借助Xdebug等工具,查看變量值的變化,或者設(shè)置斷點(diǎn)進(jìn)行調(diào)試。 2、記錄運(yùn)行日志 有些復(fù)雜或特殊的業(yè)務(wù),用上面的方法不合適,比如:一個(gè)不能被打斷的后臺(tái)運(yùn)行腳本。這些情況下記錄運(yùn)行日志比較合適。 記日志的點(diǎn)要有所選擇,除了業(yè)務(wù)上比較重要的點(diǎn),通常容易出錯(cuò)的地方有:網(wǎng)絡(luò)連接和通信、系統(tǒng)權(quán)限問(wèn)題等。 3、單元測(cè)試 以代碼測(cè)試代碼,而不是像第一點(diǎn)一樣調(diào)試完會(huì)把測(cè)試代碼丟掉。以測(cè)試驅(qū)動(dòng)開(kāi)發(fā)。 這個(gè)話題比較大,但適合放這里提一下。有興趣的同學(xué)可以去了解。 非功能性錯(cuò)誤,比如:內(nèi)存溢出導(dǎo)致程序掛掉了、效率有問(wèn)題導(dǎo)致程序非常慢、死循環(huán)了等等。 這些問(wèn)題,用“肉眼”檢查代碼效率太低了。 所以可以借助調(diào)試工具做程序的概要分析(Profiling),從中檢查出程序的瓶頸所在。 |
|
來(lái)自: corefashion > 《PHP》