自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于排錯(cuò):專注思考,細(xì)心觀察,步步為營(yíng)

開(kāi)發(fā) 測(cè)試 后端
在很多時(shí)候,我發(fā)現(xiàn)許多朋友還缺乏最基本的解決問(wèn)題,分析問(wèn)題的方式。其實(shí)我在平時(shí)工作中也會(huì)遇到各種各樣的問(wèn)題,有時(shí)候甚至異常古怪,但是在仔細(xì)分析之下,往往都能解決。于是我現(xiàn)在打算談點(diǎn)解決問(wèn)題的基本方式,希望可以幫到一些朋友。

時(shí)常有朋友發(fā)郵件給我,說(shuō)遇到了一個(gè)什么什么奇怪的問(wèn)題,不知道是怎么回事,希望我?guī)兔纯础N一旧厦刻於紩?huì)抽出或長(zhǎng)或短的時(shí)間來(lái)回復(fù)這些郵件,不過(guò)也經(jīng)常發(fā)現(xiàn),其實(shí)許許多多的問(wèn)題都完全是有能力自行解決的。在很多時(shí)候,我發(fā)現(xiàn)許多朋友還缺乏最基本的解決問(wèn)題,分析問(wèn)題的方式。其實(shí)我在平時(shí)工作中也會(huì)遇到各種各樣的問(wèn)題,有時(shí)候甚至異常古怪,但是在仔細(xì)分析之下,往往都能解決。于是我現(xiàn)在打算談點(diǎn)解決問(wèn)題的基本方式,希望可以幫到一些朋友。

如果您也有著方面的體會(huì),也可以分享一下,即使是某個(gè)簡(jiǎn)單案例也是很有幫助的。

要解決問(wèn)題,首先是要定位問(wèn)題,配合正確的推理方式,再仔細(xì)分析,“動(dòng)手嘗試”很可能只是驗(yàn)證推理是否正確的手段而已,其實(shí)大部分的情況都可以用思考來(lái)得出(或排除)。要定位問(wèn)題,很重要的一點(diǎn)便是要把概念理清。很多朋友會(huì)輕視概念,認(rèn)為那種“理論”有什么重要的,最關(guān)鍵的是“動(dòng)手”——但殊不知概念能讓您的“動(dòng)手”少走很多彎路。

例如,在一個(gè)問(wèn)題出現(xiàn)之后,我往往會(huì)心想,這到底是“開(kāi)發(fā)時(shí)”還是“運(yùn)行時(shí)”的問(wèn)題。我們?cè)谧鲩_(kāi)發(fā)時(shí)會(huì)用到許多概念,有些是“開(kāi)發(fā)時(shí)”的概念,有些則是“運(yùn)行時(shí)”的概念。我們開(kāi)發(fā)會(huì)用到很多工具,Visual Studio是一個(gè)大工具,但是它也會(huì)把很多功能,如“編譯”等操作委托給外部的命令,VS只負(fù)責(zé)捕獲那些輸出而已。而在運(yùn)行的時(shí)候,根本不會(huì)關(guān)VS什么事情。之前我寫(xiě)過(guò)一篇文章,指出csproj,sln等等都是開(kāi)發(fā)時(shí)的概念,它們離開(kāi)了Visual Studio,MSBuild等開(kāi)發(fā)工具之后,就沒(méi)有任何作用了。同樣,“項(xiàng)目模板”也是Vistual Studio才知道的東西,而運(yùn)行的根本不會(huì)關(guān)心所謂的ASP.NET Web Site還是Web Application。

于是,許多問(wèn)題的排錯(cuò)就可以有大致的方向了。許多做ASP.NET的朋友都會(huì)問(wèn):“為什么我創(chuàng)建的ASP.NET AJAX項(xiàng)目可以運(yùn)行”,但是用“ASP.NET Web Application”創(chuàng)建的項(xiàng)目就沒(méi)法使用ASP.NET AJAX了呢?很明顯,這個(gè)問(wèn)題的關(guān)鍵不在“使用什么模板創(chuàng)建的項(xiàng)目”,而是這個(gè)項(xiàng)目中的內(nèi)容是否可以執(zhí)行,更確切地說(shuō),是某個(gè)文件夾下的內(nèi)容能否使用 ASP.NET AJAX——因?yàn)閷?duì)于IIS來(lái)說(shuō),它不會(huì)關(guān)心“項(xiàng)目”(也就是csproj文件)在管理哪些資源,它只知道“網(wǎng)站目錄”。

好,既然知道是網(wǎng)站內(nèi)容的問(wèn)題,那么接下來(lái)就應(yīng)該比較的是“一個(gè)可以運(yùn)行的網(wǎng)站”和“一個(gè)不能運(yùn)行的網(wǎng)站”究竟有什么區(qū)別。ASP.NET站點(diǎn)最關(guān)鍵的東西便在于web.config,“能夠運(yùn)行”往往也是web.config來(lái)決定的。例如,你有沒(méi)有正確配置HttpModule或HttpHandler。在許多情況下,解決了ASP.NET站點(diǎn)的web.config,問(wèn)題也就解決了大半。同樣的情況還會(huì)有,為什么同樣的代碼(標(biāo)記)在有的aspx上就能解析成功,有的就不行?那可能是web.config中沒(méi)有引入正確的control標(biāo)記或命名空間造成的。

有朋友可能會(huì)說(shuō),你知道 web.config的那么多節(jié)點(diǎn)是做什么的,自然容易排錯(cuò),我都不知道,怎么知道問(wèn)題在哪里?其實(shí),我也不知道很多東西,但是我會(huì)比較。我一開(kāi)始用VS 寫(xiě)F#程序的時(shí)候,都只是用一個(gè)文件來(lái)練習(xí)。后來(lái)想要用多個(gè)模塊了,于是就創(chuàng)建新的源文件。但是我發(fā)現(xiàn),main方法總是說(shuō)寫(xiě)在新文件里的模塊“還沒(méi)有定義”,這讓我很困惑。于是乎,我去網(wǎng)上找一些示例——不是普通代碼片斷,而是一些用VS編輯的小型項(xiàng)目,它們自然是能夠編譯通過(guò)的。例如,我拿到了項(xiàng)目 A,我就開(kāi)始比較它和我的寫(xiě)法究竟有什么問(wèn)題——觀察下來(lái)沒(méi)有任何收獲,我還是覺(jué)得我的做法沒(méi)有任何問(wèn)題。于是我嘗試著在A項(xiàng)目中添加我的模塊——奇怪,在A的main方法中還是訪問(wèn)不到新模塊——這不是欺負(fù)人么!

于是我進(jìn)行更深入的比較,比較除了源文件之外,它的項(xiàng)目設(shè)置和我的項(xiàng)目設(shè)置有什么區(qū)別——還是沒(méi)有!我抱著最后一絲希望,將A項(xiàng)目中的代碼添加到我的項(xiàng)目中來(lái),編譯,還是失??!但是看到這個(gè)結(jié)果,我反而看到了解決問(wèn)題的曙光。因?yàn)槲叶家呀?jīng)把源代碼統(tǒng)一了,這樣可能發(fā)生錯(cuò)誤的地方可謂少之又少。剛才我提到,VS將編譯工作交給外部命令執(zhí)行,對(duì)于F#也一樣。于是我就比較項(xiàng)目A和我的項(xiàng)目在編譯時(shí)的輸出,終于發(fā)現(xiàn)兩者的區(qū)別在于調(diào)用fsc.exe的時(shí)候,參數(shù)順序不同。F#的編譯器和C#編譯器不同的地方在于,它對(duì)源文件指定的順序是有要求的,只有放在后面文件中的代碼才能訪問(wèn)到前面文件中定義的內(nèi)容,反之則不行。這意味著,main方法必須作為最后一個(gè)源文件存在。但是,VS并沒(méi)有提供一個(gè)選項(xiàng)來(lái)調(diào)整源文件的順序,既然這樣,那就手動(dòng)編輯fsproj文件吧。至此,問(wèn)題解決。

我被這個(gè)問(wèn)題困擾很久的原因,就是在于我從來(lái)沒(méi)有去懷疑過(guò)F#編譯器對(duì)源文件的指定順序是有要求的。我之前也觀察過(guò)fsc.exe的參數(shù),但是并沒(méi)有“看出”什么問(wèn)題出來(lái)。但是,我會(huì)和一個(gè)成功的項(xiàng)目慢慢比較,把我的項(xiàng)目和它慢慢靠攏,我用這種方式排除了各種錯(cuò)誤可能性,最終把我的關(guān)注點(diǎn)又“逼迫”到編譯器的參數(shù)上。進(jìn)行比較,嘗試,最終解決問(wèn)題。再此之前,我也不知道這一點(diǎn),不是嗎?您其實(shí)也一樣,如果遇到了一個(gè)奇怪的問(wèn)題,沒(méi)關(guān)系,找一個(gè)成功的案例,詳細(xì)比較為什么它能行而我不行,慢慢地向它靠攏。最終解決問(wèn)題的時(shí)候,就是你獲得新知識(shí)的時(shí)候。這樣,你的“經(jīng)驗(yàn)”增加了。

類(lèi)似的做法還有:不時(shí)有朋友會(huì)問(wèn)到,它的 WebForm項(xiàng)目出現(xiàn)了這樣那樣的問(wèn)題,例如在PostBack之后事件沒(méi)有執(zhí)行,狀態(tài)沒(méi)有恢復(fù),讀不到某個(gè)值等等。從我的經(jīng)驗(yàn)上來(lái)說(shuō),這是遇到了生命周期的問(wèn)題。但是,生命周期是個(gè)復(fù)雜的玩意兒,除非我親手進(jìn)行嘗試,我也不可能知道某個(gè)特定項(xiàng)目特定問(wèn)題的解決方案。其實(shí)對(duì)于這種問(wèn)題,最好的方法之一,便是從最簡(jiǎn)化的模型開(kāi)始嘗試。例如,您可以準(zhǔn)備一個(gè)空白頁(yè)面,添加一些控件和代碼,執(zhí)行,成功。然后,您將這個(gè)簡(jiǎn)單的頁(yè)面向您的項(xiàng)目進(jìn)行靠攏,一次增加一小部分,然后執(zhí)行看看是否成功。直到某段代碼添加之后發(fā)現(xiàn)失敗了,您就知道到底是什么原因引起的??赡苁切碌拇a有問(wèn)題,也可能是新代碼讓之前代碼的問(wèn)題暴露出來(lái)了。

對(duì)于排錯(cuò)來(lái)說(shuō),最關(guān)鍵的是思考和分析,而不是動(dòng)手。我有時(shí)候見(jiàn)到一些同事在遇到錯(cuò)誤之后就開(kāi)始盲目地修改代碼,重試,最后就算把問(wèn)題碰對(duì)了,時(shí)間也浪費(fèi)了——而且還可能把原有正確的地方改壞了。要進(jìn)行思考和分析,就要細(xì)心觀察,例如您有沒(méi)有看清異常的信息是什么?有沒(méi)有順著InnerException一級(jí)一級(jí)往下看,看看最終是哪行代碼出的問(wèn)題?如今的框架,一般都會(huì)把錯(cuò)誤信息寫(xiě)的非常完整。記得之前做WCF的時(shí)候,它甚至?xí)嬖V你可以嘗試著修改配置中的哪個(gè)節(jié)點(diǎn)!如果您直接忽視這些,就喪失了第一手信息了。

還有,別怕英文,就個(gè)錯(cuò)誤信息而已,沒(méi)幾個(gè)詞的。

但是我可以這么說(shuō),許多朋友都缺少思考。因?yàn)閺乃麄兘o我的郵件上來(lái)看,根本沒(méi)有把問(wèn)題描述清楚。我相信“如果說(shuō)不清楚,那說(shuō)明沒(méi)想清楚”。事實(shí)上,如果能把問(wèn)題描述清楚了,一般也可以找出用什么關(guān)鍵字去搜索引擎上查找信息。我很奇怪,許多朋友還不會(huì)用搜索引擎,例如他們會(huì)對(duì)搜索引擎說(shuō)很長(zhǎng)一句話,而不是提取出中間的“關(guān)鍵字”進(jìn)行查詢。更嚴(yán)重的問(wèn)題是“造詞”。例如“注入”,這個(gè)詞很流行啊,腳本注入,SQL注入。于是很多人在提問(wèn)的時(shí)候也一直“注入”,但事實(shí)上他的問(wèn)題和任何一種“現(xiàn)存的注入”的含義都不同。當(dāng)然,您覺(jué)得這是“注入”也沒(méi)有關(guān)系,但是至少描述一下在您的場(chǎng)景下“注入”是什么意思,對(duì)不對(duì)?而且,如果你用“注入”去搜索引擎上查詢,就會(huì)發(fā)現(xiàn)基本上找不到你想要的東西,因?yàn)?ldquo;注入”這個(gè)詞在互聯(lián)網(wǎng)上有別的含義,它和你的含義完全不同,又能給你什么信息呢?

此外,查到內(nèi)容之后,也要進(jìn)行基本的信息篩選。例如,一些小站,垃圾站的信息就不要關(guān)心了吧。直接找一些著名的大站,如官方社區(qū),文檔,博客就行了。

最后一點(diǎn)是為我個(gè)人而說(shuō)的。如果您希望讓我分析代碼,還請(qǐng)把所有可運(yùn)行的東西打一個(gè)包給我,并告訴一個(gè)略為詳細(xì)的步驟,讓我可以直接雙擊打開(kāi)編譯執(zhí)行并重現(xiàn)問(wèn)題。如果您只給我一個(gè)代碼片斷,還無(wú)法編譯通過(guò),或者還需要我自己去補(bǔ)充各類(lèi)庫(kù),那我就只能說(shuō)聲抱歉了。同樣,如果涉及到數(shù)據(jù)庫(kù),那么請(qǐng)給一個(gè)用于創(chuàng)建腳本和測(cè)試數(shù)據(jù)的SQL文件。此外,如果項(xiàng)目太大,最好也新建一個(gè)項(xiàng)目,只放一些核心的東西即可,關(guān)鍵在于重現(xiàn)問(wèn)題。而且就我個(gè)人經(jīng)驗(yàn)來(lái)說(shuō),經(jīng)過(guò)“提煉” 之后,說(shuō)不定您自己就已經(jīng)發(fā)現(xiàn)問(wèn)題所在了。

原文鏈接:http://www.cnblogs.com/JeffreyZhao/archive/2009/10/14/about-debugging.html

責(zé)任編輯:林師授 來(lái)源: 博客園
相關(guān)推薦

2011-07-09 16:43:22

激光打印機(jī)技巧

2020-12-14 18:07:18

云計(jì)算云遷移IT

2019-05-15 12:57:34

網(wǎng)易企業(yè)業(yè)務(wù)人工智能

2010-10-25 10:38:51

云計(jì)算

2012-02-09 09:19:21

阿里巴巴云計(jì)算華為

2013-03-28 11:43:54

英特爾架構(gòu)手機(jī)

2023-06-09 16:49:14

2012-04-16 14:50:18

華為服務(wù)器

2024-03-25 08:45:18

郵件發(fā)送Spring應(yīng)用程序

2019-10-18 15:55:34

5G蘋(píng)果華為

2019-05-23 10:32:33

網(wǎng)易企業(yè)業(yè)務(wù)人工智能

2017-07-19 10:22:07

2013-03-28 11:15:44

2011-09-09 14:52:55

2024-09-26 19:00:54

2024-03-11 08:34:43

同步異步調(diào)用

2016-05-17 17:21:30

睿碼科技 社交大數(shù)

2023-09-08 12:37:15

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)