第一篇:17個(gè)新手常見Python運(yùn)行時(shí)錯(cuò)誤
17個(gè)新手常見Python運(yùn)行時(shí)錯(cuò)誤
來源:OSChina作者:彭博發(fā)表于:2012-07-31 12:
53當(dāng)初學(xué) Python 時(shí),想要弄懂 Python 的錯(cuò)誤信息的含義可能有點(diǎn)復(fù)雜。這里列出了常見的的一些讓你程序 crash 的運(yùn)行時(shí)錯(cuò)誤。
1)忘記在 if , elif , else , for , while , class ,def聲明末尾添加:(導(dǎo)致“SyntaxError:invalid syntax”)該錯(cuò)誤將發(fā)生在類似如下代碼中:
if spam == 42 print('Hello!')
2)使用 = 而不是 ==(導(dǎo)致“SyntaxError: invalid syntax”)
= 是賦值操作符而 == 是等于比較操作。該錯(cuò)誤發(fā)生在如下代碼中:
if spam = 42: print('Hello!')
3)錯(cuò)誤的使用縮進(jìn)量。(導(dǎo)致“IndentationError:unexpected indent”、“IndentationError:unindent does not match any outer indetation level”以及“IndentationError:expected an indented block”)
記住縮進(jìn)增加只用在以:結(jié)束的語(yǔ)句之后,而之后必須恢復(fù)到之前的縮進(jìn)格式。該錯(cuò)誤發(fā)生在如下代碼中:
print('Hello!')
print('Howdy!')
或者:
if spam == 42:
print('Hello!')
print('Howdy!')
或者:
if spam == 42:
print('Hello!')
4)在 for 循環(huán)語(yǔ)句中忘記調(diào)用len()(導(dǎo)致“TypeError: 'list' object cannot be interpreted as an integer”)
通常你想要通過索引來迭代一個(gè)list或者string的元素,這需要調(diào)用 range()函數(shù)。要記得返回len值而不是返回這個(gè)列表。
該錯(cuò)誤發(fā)生在如下代碼中:
spam = ['cat', 'dog', 'mouse']
fori in range(spam):
print(spam[i])
5)嘗試修改string的值(導(dǎo)致“TypeError: 'str' object does not support item assignment”)string是一種不可變的數(shù)據(jù)類型,該錯(cuò)誤發(fā)生在如下代碼中:
spam = 'I have a pet cat.'
spam[13] = 'r'
print(spam)
而你實(shí)際想要這樣做:
spam = 'I have a pet cat.'
spam = spam[:13] + 'r' + spam[14:] print(spam)
6)嘗試連接非字符串值與字符串(導(dǎo)致“TypeError: Can't convert 'int' object to str implicitly”)該錯(cuò)誤發(fā)生在如下代碼中:
numEggs = 12
print('I have ' + numEggs + ' eggs.')
而你實(shí)際想要這樣做:
numEggs = 12
print('I have ' + str(numEggs)+ ' eggs.')
或者:
numEggs = 12 print('I have %s eggs.' %(numEggs))
7)在字符串首尾忘記加引號(hào)(導(dǎo)致“SyntaxError: EOL while scanning string literal”)該錯(cuò)誤發(fā)生在如下代碼中:
print(Hello!')
或者:
print('Hello!)
或者:
myName = 'Al' print('My name is ' + myName +.How are you?')
8)變量或者函數(shù)名拼寫錯(cuò)誤(導(dǎo)致“NameError: name 'fooba' is not defined”)
該錯(cuò)誤發(fā)生在如下代碼中:
foobar = 'Al'
print('My name is ' + fooba)
或者:
spam = ruond(4.2)
或者:
spam = Round(4.2)
9)方法名拼寫錯(cuò)誤(導(dǎo)致“AttributeError: 'str' object has no attribute 'lowerr'”)
該錯(cuò)誤發(fā)生在如下代碼中:
spam = 'THIS IS IN LOWERCASE.' spam = spam.lowerr()
10)引用超過list最大索引(導(dǎo)致“IndexError: list index out of range”)
該錯(cuò)誤發(fā)生在如下代碼中:
spam = ['cat', 'dog', 'mouse'] print(spam[6])
11)使用不存在的字典鍵值(導(dǎo)致“KeyError:‘spam’”)
該錯(cuò)誤發(fā)生在如下代碼中:
spam = {'cat': 'Zophie', 'dog': 'Basil', 'mouse': 'Whiskers'} print('The name of my pet zebra is ' + spam['zebra'])
12)嘗試使用Python關(guān)鍵字作為變量名(導(dǎo)致“SyntaxError:invalid syntax”)
Python關(guān)鍵不能用作變量名,該錯(cuò)誤發(fā)生在如下代碼中:
class = 'algebra'
Python3的關(guān)鍵字有:and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, while, with, yield
13)在一個(gè)定義新變量中使用增值操作符(導(dǎo)致“NameError: name 'foobar' is not defined”)不要在聲明變量時(shí)使用0或者空字符串作為初始值,這樣使用自增操作符的一句spam += 1等于spam = spam + 1,這意味著spam需要指定一個(gè)有效的初始值。
該錯(cuò)誤發(fā)生在如下代碼中:
spam = 0
spam += 42
eggs += 42
14)在定義局部變量前在函數(shù)中使用局部變量(此時(shí)有與局部變量同名的全局變量存在)(導(dǎo)致“UnboundLocalError: local variable 'foobar' referenced before assignment”)
在函數(shù)中使用局部變來那個(gè)而同時(shí)又存在同名全局變量時(shí)是很復(fù)雜的,使用規(guī)則是:如果在函數(shù)中定義了任何東西,如果它只是在函數(shù)中使用那它就是局部的,反之就是全局變量。這意味著你不能在定義它之前把它當(dāng)全局變量在函數(shù)中使用。
該錯(cuò)誤發(fā)生在如下代碼中:
someVar = 42 defmyFunction():
print(someVar)
someVar = 100
myFunction()15)嘗試使用 range()創(chuàng)建整數(shù)列表(導(dǎo)致“TypeError: 'range' object does not support item assignment”)
有時(shí)你想要得到一個(gè)有序的整數(shù)列表,所以 range()看上去是生成此列表的不錯(cuò)方式。然而,你需要記住 range()返回的是“range object”,而不是實(shí)際的 list 值。
該錯(cuò)誤發(fā)生在如下代碼中:
spam = range(10)
spam[4] =-1
也許這才是你想做:
spam = list(range(10))
spam[4] =-1
(注意:在 Python 2 中 spam = range(10)是能行的,因?yàn)樵?Python 2 中 range()返回的是list值,但是在 Python 3 中就會(huì)產(chǎn)生以上錯(cuò)誤)
16)不錯(cuò)在 ++ 或者--自增自減操作符。(導(dǎo)致“SyntaxError: invalid syntax”)
如果你習(xí)慣于例如 C++ , Java , PHP 等其他的語(yǔ)言,也許你會(huì)想要嘗試使用 ++ 或者--自增自減一個(gè)變量。在Python中是沒有這樣的操作符的。
該錯(cuò)誤發(fā)生在如下代碼中:
spam = 1
spam++
也許這才是你想做的:
spam = 1 spam += 1 17)忘記為方法的第一個(gè)參數(shù)添加self參數(shù)(導(dǎo)致“TypeError: myMethod()takes no arguments(1 given)”)
該錯(cuò)誤發(fā)生在如下代碼中:
class Foo():
defmyMethod():
print('Hello!')
a = Foo()
a.myMethod()
第二篇:個(gè)人簡(jiǎn)歷常見錯(cuò)誤
必讀:6個(gè)簡(jiǎn)歷里常見的錯(cuò)誤
從頭到尾我也做過一些招聘工作,從簡(jiǎn)歷篩選、通知面試、面試都在進(jìn)行。發(fā)現(xiàn)很多人在簡(jiǎn)歷中犯了不少錯(cuò)誤,也許對(duì)于求職者來說是很小的問題,但是其實(shí)往往決定了一個(gè)機(jī)會(huì)的得失,覺得有必要整理出來,給大家一個(gè)提醒。
1、簡(jiǎn)歷上的電話停機(jī)或者關(guān)機(jī)狀態(tài)
這個(gè)問題一說出來,可能大家會(huì)覺得很可笑,怎么可能是一個(gè)重要問題。我也很驚訝,就我們統(tǒng)計(jì)的結(jié)果來看,篩選出的簡(jiǎn)歷,大約有20%是由于電話停關(guān)機(jī)的問題沒辦法通知到的。我總結(jié)一個(gè)原因是不少異地求職的人員到當(dāng)?shù)厍舐毢?,發(fā)送簡(jiǎn)歷的時(shí)候忘記把已經(jīng)更換的號(hào)碼在簡(jiǎn)歷上更新了;另一個(gè)是很多人使用的神州行、動(dòng)感地帶的號(hào)碼需要充值,但是覺得晚
一、兩天沒事;殊不知,每天求職的簡(jiǎn)歷成百上千,通知面試的人不可能天天跟蹤你的電話開通情況的。即使暫時(shí)不方便接聽電話,也建議可申請(qǐng)秘書臺(tái)服務(wù),不漏掉一個(gè)可能的機(jī)會(huì)。注意更新自己的簡(jiǎn)歷聯(lián)系方式,保證自己能隨時(shí)被找到,讓自己處在隨時(shí)啟動(dòng)的狀態(tài),會(huì)比其他人得到更多的機(jī)會(huì)。
2、未及時(shí)更改、更新簡(jiǎn)歷信息
尤其是求職信。往往收到一份簡(jiǎn)歷,求職信寫得懇切規(guī)范,但是到末尾一看,稱呼的“貴公司”名字原來根本不是我公司,不免大倒冷水,也對(duì)求職者的誠(chéng)意表示懷疑。另外就是不少人,求職信里頭一句還寫著“我是一個(gè)剛走出校門的學(xué)生?..”看到簡(jiǎn)歷里,原來已經(jīng)工作1-2年了。發(fā)出一份簡(jiǎn)歷是通過考慮,慎重地,但是這樣的簡(jiǎn)歷,很難讓人相信,不是隨手的游戲。
3、羅列全部實(shí)習(xí)經(jīng)歷
這在畢業(yè)生的簡(jiǎn)歷里經(jīng)常發(fā)現(xiàn)。為了提高自己的命中率,不少畢業(yè)生會(huì)在工作經(jīng)驗(yàn)?zāi)菣诎炎约核械膶?shí)習(xí)經(jīng)歷寫出來。粗看簡(jiǎn)歷,覺得有很多工作經(jīng)驗(yàn),但是仔細(xì)一看,就會(huì)發(fā)現(xiàn)很亂,各個(gè)經(jīng)歷之間是毫無關(guān)聯(lián)和邏輯的,家教、促銷、網(wǎng)絡(luò)管理等等。其實(shí)就畢業(yè)生來說,沒有實(shí)際的工作經(jīng)驗(yàn)是客觀事實(shí),用人單位不會(huì)因?yàn)槟懔_列了很多短期實(shí)踐就給你面試機(jī)會(huì),更看重的是你是否有能給自己加分的思想和與眾不同的潛力。羅列經(jīng)歷,只能讓自己的簡(jiǎn)歷看上去很雜亂。
4、大量、多次投遞崗位
一般的求職成功經(jīng)驗(yàn)是多撒網(wǎng),多投遞簡(jiǎn)歷,反正在網(wǎng)絡(luò)上多次投遞的邊際成本為0。但是這個(gè)多撒網(wǎng),指的是有的放矢地投遞,而非毫無目的。統(tǒng)計(jì)中,大約有35%的簡(jiǎn)歷是盲目投遞的,有的簡(jiǎn)歷根本不完整,只寫了姓名和電話,正文部分完全是空白;有的軟件專業(yè)畢業(yè),把所有的硬件崗位都申請(qǐng)了;有的多次被拒后,仍每天投遞;還有的幾乎投遞了公司所有的招聘崗位。如此瘋狂、不成熟的投遞方式,并不能帶來高的命中率,不了解自己,不了解職位的要求,很難讓用人單位相信你的符合度和穩(wěn)定性。真正命中率高的,往往是成熟的求職者:對(duì)招聘要求做了仔細(xì)的揣摩,根據(jù)自身?xiàng)l件和崗位符合度投遞簡(jiǎn)歷,并為面試做了認(rèn)真準(zhǔn)備。
5、簡(jiǎn)歷條理不清晰
一般的簡(jiǎn)歷模版,都會(huì)分工作經(jīng)驗(yàn)和學(xué)習(xí)經(jīng)歷兩部分,為了突出簡(jiǎn)歷,一些求職者會(huì)創(chuàng)造新的模版或者按照自己的思路填寫簡(jiǎn)歷,但是簡(jiǎn)歷篩選人每天在查閱大量的簡(jiǎn)歷,遇到標(biāo)新立異的簡(jiǎn)歷往往很頭痛,因?yàn)椴皇前闯R?guī)的條理來寫的,很難從中找到需要的信息,尤其3頁(yè)以上的簡(jiǎn)歷,更需要有非常清楚的條理?;蛘呔褪前l(fā)現(xiàn)了合適的簡(jiǎn)歷,但是因?yàn)槟0鎲栴},聯(lián)系方式總要到處去找。其實(shí)建議大家就用網(wǎng)站推薦的模版比較好,清楚規(guī)范,便于理解。
6、愛用附件簡(jiǎn)歷
為了省事,一些人喜歡使用附件簡(jiǎn)歷,直接發(fā)送到公布的郵箱。但是現(xiàn)在電腦病毒越來越多,很多求職者是在網(wǎng)吧里發(fā)送簡(jiǎn)歷的,各個(gè)用人單位,尤其是大公司的郵箱,防備特別嚴(yán)格,附件發(fā)送過來的簡(jiǎn)歷,十有五、六是亂碼。打不開,也無法一一直接回復(fù)各個(gè)求職者的心情,是很難受的。
常有人在論壇上問我,為什么投遞了那么多簡(jiǎn)歷,都沒有回音?但是也有人跟帖,自己投遞的命中率是很高的。沒有回音的原因可能有很多,但是我建議,那些苦苦等待回音的人們,打開自己的簡(jiǎn)歷,看看是否有以上問題?(完)
第三篇:論文常見格式錯(cuò)誤
各位指導(dǎo)老師:
首先,對(duì)大家在畢業(yè)設(shè)計(jì)中付出的勞動(dòng)表示衷心的感謝!大家辛苦了!
在近幾年的畢業(yè)設(shè)計(jì)中出現(xiàn)了一些問題,在此進(jìn)行部分匯總,供大家參考,有則改之,無則加勉!
1、請(qǐng)各位老師在以后的畢設(shè)中務(wù)必認(rèn)真負(fù)責(zé)的進(jìn)行指導(dǎo),了解學(xué)生在畢設(shè)中具體做了哪些工作,并據(jù)此給出指導(dǎo)教師分?jǐn)?shù),避免指導(dǎo)教師評(píng)分全部都是高分的情況,盡量按照優(yōu)秀15%、良好45%、中等30%、及格10%的比例進(jìn)行打分。務(wù)必請(qǐng)以后指導(dǎo)畢設(shè)的老師認(rèn)真負(fù)責(zé)的進(jìn)行論文的指導(dǎo),再次表示衷心的感謝!
2、論文中的字體要求:正文中文為宋體、英文和數(shù)字(含標(biāo)題和圖表)使用Times New Roman字體。設(shè)置方法:選中全文,設(shè)置字體中文為宋體,西文字體為Times New Roman即可;
3、論文中的所有標(biāo)點(diǎn)符號(hào)(特殊要求除外)應(yīng)使用中文全角,如逗號(hào)為“,”,而不是“,”;
4、論文中不能存在大塊空白,如圖片在該頁(yè)占不下,應(yīng)補(bǔ)充前面內(nèi)容(多說點(diǎn)話)填充空白,或?qū)D片后方文字挪到空白處(最好不采用此種方式);
5、所有圖片應(yīng)使用Visio軟件/AutoCAD/Protell等軟件由學(xué)生自己畫,圖中涉及到的文字使用10磅大小,在將圖片插入正文中時(shí),不能改變圖片大小,否則圖中文字大小將改變;
6、圖/表內(nèi)文字應(yīng)與圖/表格協(xié)調(diào),不能出現(xiàn)框大字小的情況;
7、在出現(xiàn)圖/表之前,應(yīng)在該圖/表之前的正文部分出現(xiàn)對(duì)該圖/表的引用,如“見圖1-1所示?!保⑹褂谩?,”或“。”結(jié)束,而不能使用“:”。
8、論文封皮班級(jí)處應(yīng)填寫:2009級(jí)1班/2009級(jí)2班/2011級(jí)專接本1班;
9、摘要部分應(yīng)寫該論文主要做了哪些內(nèi)容,如何做的,不能寫與論文設(shè)計(jì)過程無關(guān)的介紹性內(nèi)容,字?jǐn)?shù)要求300-500字;
10、英文摘要和外文翻譯要嚴(yán)格把關(guān),不能出現(xiàn)嚴(yán)重錯(cuò)誤;
11、論文內(nèi)容應(yīng)重點(diǎn)描述該設(shè)計(jì)是如何實(shí)現(xiàn)的,對(duì)使用到的元器件、軟件等的介紹性內(nèi)容應(yīng)壓縮到1-2頁(yè)之內(nèi);
12、另外一些格式問題請(qǐng)參看《物理系、電氣信息工程系論文撰寫規(guī)范》,如總結(jié)、參考文獻(xiàn)部分的格式、中英文摘要部分的格式等;
以上列出了在答辯過程中出現(xiàn)的一些普遍問題,請(qǐng)各位指導(dǎo)教師認(rèn)真核對(duì)自己學(xué)生的論文,是否存在以上問題,如有,請(qǐng)督促學(xué)生認(rèn)真修改,修改完成后請(qǐng)收集學(xué)生的論文一份,并收繳電子版保存。
學(xué)生論文在后續(xù)工作中都要進(jìn)行統(tǒng)一裝訂打印,因此請(qǐng)嚴(yán)格控制學(xué)生論文質(zhì)量,如在裝訂打印前發(fā)現(xiàn)論文存在質(zhì)量問題,則由指導(dǎo)教師親自進(jìn)行修改。
再次對(duì)老師的認(rèn)真負(fù)責(zé)、辛勤工作表示衷心的感謝!
第四篇:畢業(yè)論文常見錯(cuò)誤
畢業(yè)論文常見錯(cuò)誤
1.論文內(nèi)容
? 第1章緒論應(yīng)包括以下幾方面內(nèi)容:選題意義和背景;國(guó)內(nèi)外研究現(xiàn)狀;本文研究?jī)?nèi)容及各章安排。
? 第2章方案論證前,要先介紹設(shè)計(jì)要求。
? 系統(tǒng)硬件設(shè)計(jì)的介紹,不能只介紹系統(tǒng)的各個(gè)器件和模塊,還要介紹總體電路的設(shè)計(jì)。
? 系統(tǒng)軟件設(shè)計(jì)的介紹,不要羅列原程序,要以流程圖的形式介紹主程序以及各子程序的實(shí)現(xiàn)思路。
? 流程圖要符合邏輯,判斷框要標(biāo)明判斷條件。
? 最后一章結(jié)論與展望,不要寫在設(shè)計(jì)過程中學(xué)到什么,遇到什么困難以及如何克服等等。那是實(shí)習(xí)報(bào)告。要結(jié)合設(shè)計(jì)本身,介紹如何設(shè)計(jì),實(shí)現(xiàn)哪些功能,以及設(shè)計(jì)還存在哪些不足,今后如何改進(jìn)。
2.排版格式
? 杜絕錯(cuò)別字以及語(yǔ)句不通順等低級(jí)錯(cuò)誤。
? 每段首行要空兩格,每章要另起一頁(yè)開始。
? 圖中字號(hào)要與正文相仿,不能太大或太??;圖與圖名要在同一頁(yè)內(nèi),不要分開。
? 表格采用三線表,表名在表格上方。
? 圖、表、公式要按章排序,如第3章的第5張表,為“表3-5”。? 圖表要清晰。從網(wǎng)上復(fù)制過來的不清晰的圖,要重新繪制。
第五篇:網(wǎng)絡(luò)管理員常見錯(cuò)誤集錦
協(xié)議分析器是網(wǎng)絡(luò)管理員庫(kù)中最強(qiáng)有力的工具之一。它能將難處理、耗時(shí)長(zhǎng)、讓CEO們感到惱火甚至不得不重啟所有機(jī)器的問題轉(zhuǎn)變?yōu)槟芏虝r(shí)處理、易于在每周例行狀態(tài)報(bào)告中反映的問題,為公司省下大量的時(shí)間與金錢。
然而,就像其它任何復(fù)雜工具一樣,它必須被適當(dāng)運(yùn)用才能獲得最大的效益。在使用協(xié)議分析器診斷網(wǎng)絡(luò)故障時(shí),應(yīng)當(dāng)盡量避免……
錯(cuò)誤1 分析器誤置
正確放置分析器對(duì)快速診斷故障具有決定性作用。設(shè)想分析器是置于網(wǎng)絡(luò)中的窗口,猶如建筑物窗口一般,視野的改變依賴于從哪個(gè)窗口看出去。從南面窗口望去是看不到建筑物北面高速公路上交通的擁擠狀況的。在分析置于網(wǎng)絡(luò)不當(dāng)位置的分析器時(shí),跟蹤往往要花很長(zhǎng)時(shí)間。那么,怎樣正確放置分析器呢?我們可以舉例說明。
以下為幾個(gè)可能出現(xiàn)的問題及原因分析:
設(shè)想A:一臺(tái)主機(jī),服務(wù)器A,主機(jī)不能與其它任何主機(jī)通信??赡艿脑颍?/p>
1)服務(wù)器A沒有正確配置;
2)服務(wù)器A配置的網(wǎng)卡出錯(cuò);
3)服務(wù)器A所在局域網(wǎng)出了問題;
4)服務(wù)器A所在局域網(wǎng)段出錯(cuò)。
設(shè)想B:一臺(tái)主機(jī),服務(wù)器B,主機(jī)不能與遠(yuǎn)程網(wǎng)X中的任何一臺(tái)主機(jī)通信;且局域網(wǎng)或其它遠(yuǎn)程網(wǎng)中的主機(jī)無任何故障(這就意味著問題不可能出現(xiàn)在服務(wù)器B或服務(wù)器B所在局域網(wǎng)段上)。
可能原因:
1)服務(wù)器B有關(guān)網(wǎng)絡(luò)X的部分配置錯(cuò)誤;
2)3)4)5)服務(wù)器B用于連接到網(wǎng)絡(luò)X的路由器所在網(wǎng)段的連接出了問題;服務(wù)器B所在局域網(wǎng)與網(wǎng)絡(luò)X的一處或多處鏈接出了問題;網(wǎng)絡(luò)X用于連接到服務(wù)器B所在網(wǎng)絡(luò)的路由器所在網(wǎng)段出了問題;網(wǎng)絡(luò)X出了問題。
設(shè)想C:一臺(tái)主機(jī),服務(wù)器C,主機(jī)不能與局域網(wǎng)中另一主機(jī)通信,但與網(wǎng)絡(luò)中其它主機(jī)通信正常(這意味著問題不可能出現(xiàn)在服務(wù)器C或服務(wù)器C所在局域網(wǎng)段)。可能的原因:
1)主機(jī)C錯(cuò)誤配置;
2)主機(jī)C網(wǎng)卡出現(xiàn)故障;
3)主機(jī)C所在局域網(wǎng)段出了問題。
設(shè)想D:一臺(tái)主機(jī),服務(wù)器D,主機(jī)不能與一遠(yuǎn)程主機(jī)通信,但與服務(wù)器D所在局域網(wǎng)段的其它主機(jī)通信正常,到遠(yuǎn)程網(wǎng)或遠(yuǎn)程網(wǎng)自身的連接亦無故障。
可能原因:
1)主機(jī)D錯(cuò)誤配置;
2)主機(jī)D網(wǎng)卡出錯(cuò);
3)主機(jī)D所在局域網(wǎng)段出了問題。
這些問題當(dāng)中個(gè)別的不用分析器也可診斷或排除。例如:設(shè)想A中的第三種情況,就能通過檢查服務(wù)器A所在局域網(wǎng)的其它主機(jī)決定故障所在;設(shè)想D中的第二和第三種情況亦能通過這種方法確定(假設(shè)主機(jī)D能與局域網(wǎng)中其它主機(jī)通信)。
一臺(tái)服務(wù)器或主機(jī)的錯(cuò)誤配置通過檢測(cè)很容易被發(fā)現(xiàn)。但另外一些問題,像網(wǎng)絡(luò)或網(wǎng)段中的故障,就需要分析器來診斷。
在以上所有可能的設(shè)想中,一開始或許會(huì)將分析器置于離最有可能出現(xiàn)問題的主機(jī)或是懷疑有問題的網(wǎng)絡(luò)、網(wǎng)段盡可能近的地方,但是如果未發(fā)現(xiàn)有意義的問題,得準(zhǔn)備好移動(dòng)分
析器,要知道,在出現(xiàn)故障的位置被確定以前,所做的一切都是建立在猜想基礎(chǔ)上的。在以上設(shè)想B的第三種情況中,服務(wù)器B所在局域網(wǎng)和網(wǎng)絡(luò)X中都應(yīng)該有分析器,至少分析器應(yīng)該能夠從一端被移動(dòng)到另一端。
例如,一次故障中,一臺(tái)服務(wù)器突然停止了工作。人們起初懷疑是站點(diǎn)人員對(duì)服務(wù)器實(shí)施了誤操作所致,實(shí)際上跟蹤器表明,是因?yàn)楸姸嘀鳈C(jī)向服務(wù)器發(fā)送連接請(qǐng)求信息的同時(shí)服務(wù)器卻沒有響應(yīng),致使服務(wù)器死鎖。
在花了幾天時(shí)間來判斷到底服務(wù)器出了什么問題后,被告知觀察跟蹤器,于是請(qǐng)求站點(diǎn)操作員將跟蹤器從主機(jī)所在局域網(wǎng)(這里指設(shè)想B中第三種情況的網(wǎng)絡(luò)X)移到服務(wù)器所在局域網(wǎng)。結(jié)果發(fā)現(xiàn)訪問控制列表沒有被正確添加到服務(wù)器所在局域網(wǎng)的路由器上,這份錯(cuò)誤的訪問控制列表過濾了所有來源于客戶端主機(jī)所在網(wǎng)絡(luò)的信息。假若當(dāng)初多一些懷疑的話,就會(huì)發(fā)現(xiàn)在服務(wù)器所在局域網(wǎng)中根本就沒見到過連接請(qǐng)求信息。因?yàn)闆]有同時(shí)查看網(wǎng)絡(luò)兩端的情況,致使站點(diǎn)很多天不能工作。
怎么知道跟蹤器在網(wǎng)絡(luò)的哪一端起作用呢?在跟蹤器中,發(fā)自客戶端主機(jī)的幀信息都具有實(shí)客戶端所有的源MAC地址,與此同時(shí),目標(biāo)MAC地址則存放在路由器中。
不幸的是,問題變得越來越復(fù)雜,僅僅知道分析器連接于哪個(gè)網(wǎng)絡(luò)還不夠。當(dāng)將一個(gè)局域網(wǎng)分解成多個(gè)部分時(shí),首要的是去找到空閑Hub端口或同軸電纜的分接頭,然而,在網(wǎng)絡(luò)交換環(huán)境下,并不是僅僅將分析器接入交換設(shè)備的空閑端口就萬事大吉了。
大多數(shù)交換設(shè)備都具備將特定端口指定為分接頭或映像端口的能力,只是所用術(shù)語(yǔ)因交換設(shè)備制造廠商不同而有別。如果所有來自或發(fā)往特定端口的通信同樣能發(fā)送到映像端口,這時(shí)只要將分析器連接到映像端口,所有設(shè)置即告完成。
但問題在于有些交換設(shè)備不能將兩端口之間的通信發(fā)送到映像端口。舉例說,在雙工環(huán)境下,作為監(jiān)控的連接之一部分的兩臺(tái)主機(jī)能同時(shí)發(fā)送信息,交換機(jī)也能接收每幀數(shù)據(jù)并將其傳輸?shù)芥溄又械牧硗舛丝?。但?duì)于映像端口,必須對(duì)某一數(shù)據(jù)幀進(jìn)行緩沖,如果這樣處理了太多幀,緩沖區(qū)就會(huì)溢出,數(shù)據(jù)幀就會(huì)丟失,跟蹤因此變得不可靠。更糟的是,根本就不知道是在跟蹤不可靠的線索。
某些交換設(shè)備支持內(nèi)部分析器功能,這類交換機(jī)本身能夠俘獲傳向被跟蹤對(duì)象的數(shù)據(jù)幀。這種功能部件的可靠性依賴于交換機(jī)的緩沖容量。在某些情況下,我們不得不選擇映像端口或是內(nèi)部分析器方式。但只要有可能,最好是將主機(jī)之一和分析器連接到Hub,并將Hub掛到交換機(jī)上。
為什么這么做呢?這是因?yàn)榧词勾_信交換機(jī)有足夠容量緩存所有數(shù)據(jù)幀,以至于映像端口或內(nèi)部分析器不可能丟數(shù)據(jù),跟蹤仍然是不可靠的。例如,標(biāo)準(zhǔn)以太網(wǎng)中,一個(gè)處于交換機(jī)有故障端口的RJ45連接器每當(dāng)交換機(jī)向服務(wù)器傳輸數(shù)據(jù)幀時(shí)都會(huì)創(chuàng)建交互式會(huì)話,交換機(jī)將此解釋成為一次沖突并停止工作,當(dāng)嘗試16次之后數(shù)據(jù)幀就會(huì)撤消,但數(shù)據(jù)幀仍被發(fā)送到映像端口,因此跟蹤器發(fā)現(xiàn)了數(shù)據(jù)幀并顯示服務(wù)器響應(yīng)失敗。另一種情況是:不合規(guī)格的配線導(dǎo)致1%的數(shù)據(jù)幀破壞。如果將分析器與第一種情況(任何位置的數(shù)據(jù)幀都能傳送)中提到的的主機(jī)一起掛到Hub,或者與第二種情況(網(wǎng)絡(luò)中有被破壞的數(shù)據(jù)幀)中主機(jī)一起掛到Hub,接收交換機(jī)的端口會(huì)在未將數(shù)據(jù)幀發(fā)往映像端口之前就將它們撤消,跟蹤器沒有任何錯(cuò)誤指示。當(dāng)然,每當(dāng)改變一種方式,都得冒一定風(fēng)險(xiǎn)來糾正可能出現(xiàn)的意外問題。如果RJ45連接器出現(xiàn)故障僅僅是因?yàn)闆]有在交換機(jī)端口將其固定好,那么只要將連接器重新插入Hub,故障或許也就不存在了,至少問題是得到了解決。
另外需要記住的是,對(duì)于交換設(shè)備,在其網(wǎng)段內(nèi)每個(gè)端口都是有效的,因此當(dāng)連接到服務(wù)器的交換端口未發(fā)現(xiàn)問題時(shí),應(yīng)將Hub(或分析器)移動(dòng)到主機(jī)或路由器交換端口。還有,注意不能將Hub掛到雙工環(huán)境。有些分析器能以雙工方式工作,這類分析器有兩個(gè)以太網(wǎng)口和一個(gè)功能模塊,功能模塊將通信對(duì)分為兩部分,并分別發(fā)送到每一以太網(wǎng)口,之后軟件把從每個(gè)以太網(wǎng)口接收來的數(shù)據(jù)結(jié)合成單一的跟蹤鏈。如果網(wǎng)絡(luò)是雙工環(huán)境,就需要這種分析器。
錯(cuò)誤2 過多的過濾
過濾功能允許協(xié)議分析器忽略某些數(shù)據(jù)幀,從而為感興趣的幀騰出更多的俘獲緩沖空間。如果能過濾來源于較高協(xié)議層的數(shù)據(jù),如IP地址和端口號(hào)以至更高層數(shù)據(jù),則分析器幾乎很少需要基于源或目標(biāo)MAC地址的過濾。然而,實(shí)際跟蹤中通常出現(xiàn)的問題是過濾太多。
有一個(gè)站點(diǎn)出現(xiàn)過這樣的故障:服務(wù)器與一特定客戶端之間的連接出了問題,莫名其妙地?cái)嚅_了,其它客戶端都沒有任何問題。由于客戶端與服務(wù)器處在同一子網(wǎng),一旦發(fā)生斷開現(xiàn)象,使客戶端與服務(wù)器恢復(fù)連接的唯一辦法是重新啟動(dòng)服務(wù)器。
這個(gè)站點(diǎn)安裝了分析器,同時(shí)因?yàn)閿?shù)據(jù)量大,配置了過濾器,只允許俘獲兩主機(jī)(基于MAC地址)之間的數(shù)據(jù)幀。前兩天中沒有發(fā)現(xiàn)問題,但在第三天問題出現(xiàn)了:跟蹤表明服務(wù)器突然停止了發(fā)送多路會(huì)話和最后一次會(huì)話。當(dāng)從服務(wù)器端ping客戶端時(shí),跟蹤器顯示服務(wù)器沒有發(fā)送任何數(shù)據(jù)幀。站點(diǎn)操作員得出的結(jié)論是:TCP?;虿僮飨到y(tǒng)出了問題。于是請(qǐng)求另一次跟蹤,這次沒有使用過濾器。一天半以后俘獲了另一事件:跟蹤清楚表明服務(wù)器持續(xù)發(fā)送數(shù)據(jù),而與此同時(shí)卻再也沒有得到應(yīng)答。經(jīng)過更深層挖掘,發(fā)現(xiàn)服務(wù)器數(shù)據(jù)幀的目標(biāo)MAC地址突然改變了。
既然目標(biāo)MAC地址不再與客戶端的相匹配,那么第一次未使用過濾器的跟蹤就不再俘獲到MAC地址,同時(shí)表明服務(wù)器已停止了工作。另外發(fā)現(xiàn)就在地址改變之前,服務(wù)器無故收到帶有為客戶端IP地址配置的新MAC地址的ARP信息包,這導(dǎo)致服務(wù)器升級(jí)ARP緩存并向錯(cuò)誤主機(jī)發(fā)送數(shù)據(jù)。
通過ARP數(shù)據(jù)幀的源MAC地址由無故發(fā)送ARP的主機(jī)向下跟蹤,不知何故,主機(jī)居然同時(shí)配置了復(fù)用于客戶端的靜態(tài)IP地址和DHCP地址。當(dāng)主機(jī)啟動(dòng)時(shí),分配的是靜態(tài)地址,這與服務(wù)器相沖突,于是調(diào)用DHCP,正確地址才配置上。
基于這一點(diǎn)可得出這樣一個(gè)結(jié)論:用過濾器看似很有道理,但很多時(shí)候問題的根源往往以假象出現(xiàn)在過濾器之外,如果跟蹤器沒有表明問題的起因,過濾器應(yīng)當(dāng)關(guān)閉,或至少應(yīng)當(dāng)擴(kuò)展一下,直至跟蹤器確實(shí)查出原因。僅當(dāng)所有過濾器都關(guān)閉后跟蹤器仍無法查出問題起因,才可以得出結(jié)論——對(duì)網(wǎng)絡(luò)已無計(jì)可施了。
錯(cuò)誤3
俘獲時(shí)幀太短
前面例子中表明,站點(diǎn)操作員使用過濾器是因?yàn)榫W(wǎng)絡(luò)中數(shù)據(jù)量過大。分析器僅能俘獲大約3分鐘時(shí)間的數(shù)據(jù),這使得站點(diǎn)操作員幾乎不可能發(fā)現(xiàn)問題的發(fā)生并使分析器及時(shí)加以阻止以真正找到問題的起因。分析器能夠俘獲數(shù)據(jù)幀而沒有將它們填入俘獲緩沖區(qū)的時(shí)間長(zhǎng)短取決于網(wǎng)絡(luò)的速度、網(wǎng)絡(luò)中幀的數(shù)量、幀的大小以及俘獲緩沖區(qū)的大小。
幾乎所有分析器都能控制俘獲數(shù)據(jù)幀的大小,這在處理連接問題和不太高協(xié)議層問題時(shí)顯得很有用。在通常情況下,只要俘獲數(shù)據(jù)的第一個(gè)64字節(jié)也就足夠了。因此,如果網(wǎng)絡(luò)中所有幀都是1024字節(jié)而僅有3分鐘俘獲時(shí)間,那么僅俘獲64字節(jié)將允許有超過30分鐘的俘獲時(shí)間。
錯(cuò)誤4
觸發(fā)器安裝不正確
觸發(fā)器告訴分析器執(zhí)行某項(xiàng)操作,比如終止俘獲。當(dāng)?shù)却龁栴}發(fā)生而又不知道將何時(shí)發(fā)生時(shí),觸發(fā)器顯得很有用。
安裝觸發(fā)器意味著沒有必要隨時(shí)以手動(dòng)方式來控制分析器。觸發(fā)器安裝的最大問題往往是沒有正確定義,這會(huì)大大延長(zhǎng)解決問題的時(shí)間。
當(dāng)然,應(yīng)該詳細(xì)知道怎樣安裝觸發(fā)器,并且,若有可能,在使用之前進(jìn)行測(cè)試。有時(shí)可以安裝另一臺(tái)分析器來發(fā)送觸發(fā)數(shù)據(jù)幀,以確認(rèn)俘獲分析觸發(fā)器已正確安裝。
使用觸發(fā)器帶來的另一問題是,許多分析器允許設(shè)置將被預(yù)觸發(fā)的俘獲緩沖區(qū)的百分比。舉例來說,可以指定50%的緩沖區(qū)在觸發(fā)之前俘獲,而另外50%的緩沖區(qū)在觸發(fā)之后俘獲。預(yù)觸發(fā)的百分比通常是0、25、50、75或100。
如果預(yù)觸發(fā)值設(shè)置不當(dāng),就有可能俘獲不到足夠的相關(guān)數(shù)據(jù)幀來診斷問題所在。預(yù)觸發(fā)值有可能被錯(cuò)誤設(shè)置是因?yàn)槠淠J(rèn)設(shè)置對(duì)現(xiàn)行問題往往不適用:也許是因?yàn)槲磳⑨槍?duì)前一問題的設(shè)置升級(jí),也許是因?yàn)榇中牡氖髽?biāo)操作或錯(cuò)誤按鍵。無論何種原因,一定要確認(rèn)觸發(fā)器已正確安裝。
那么怎樣來設(shè)置呢?通常是將預(yù)觸發(fā)百分比設(shè)為100%,以知道是什么原因?qū)е掠|發(fā)器關(guān)閉。
當(dāng)然,只有當(dāng)觸發(fā)器在觸發(fā)某事件時(shí),它才處于關(guān)閉狀態(tài)。過去使用過特殊的觸發(fā)程序,它能測(cè)試狀態(tài),然后發(fā)送信息包,分析器可將此信息包用作觸發(fā)器。測(cè)試狀態(tài)可以是日志文件中的錯(cuò)誤信息,或是上例中無法創(chuàng)建連接的情況。一般整個(gè)程序也就一百多行或稍長(zhǎng)一些。錯(cuò)誤5
日期/時(shí)間設(shè)置不正確
沒有正確設(shè)置分析器上的日期/時(shí)間看似一件小事,很多時(shí)候可能也確實(shí)是這樣。然而,當(dāng)處理廣域網(wǎng)絡(luò)中的問題時(shí),有時(shí)同時(shí)運(yùn)行兩臺(tái)分析器,網(wǎng)絡(luò)每端一臺(tái),則正確設(shè)置日期/時(shí)間是相當(dāng)有用的。
如果將兩臺(tái)分析器時(shí)鐘設(shè)置相同,調(diào)整跟蹤會(huì)變得更為容易。假定在一個(gè)例子中,通過發(fā)現(xiàn)通用幀并比較時(shí)間,會(huì)發(fā)現(xiàn)其中一臺(tái)用了4小時(shí)37分,比另一臺(tái)提前了15.7891秒,如果時(shí)鐘設(shè)置同步誤差在1到2秒,時(shí)間差距計(jì)算也就容易多了。
另外,如果需要費(fèi)勁地隨主機(jī)中的事件調(diào)整跟蹤,由于基于時(shí)間包的同步是不可選的,則設(shè)置相同的日期/時(shí)間絕對(duì)具有實(shí)質(zhì)意義。
錯(cuò)誤6 不理解協(xié)議
很多分析器具有“專家分析”功能,指的是它們能保持對(duì)信息的追蹤,像序列號(hào)、時(shí)間信息、顯示重傳信息、凍結(jié)窗口、無應(yīng)答狀態(tài)等等。這類分析相當(dāng)有用,但也有可能造成誤導(dǎo),尤其在分析器沒有正確報(bào)錯(cuò)時(shí)。
舉個(gè)例子,有一種情況:從一遠(yuǎn)程位置發(fā)來的遠(yuǎn)程登錄會(huì)話無法建立,而發(fā)自局域工作站的遠(yuǎn)程登錄會(huì)話卻沒有問題。于是站點(diǎn)操作人員在遠(yuǎn)程登錄服務(wù)器所在的局域網(wǎng)掛一分析器,跟蹤器表明從遠(yuǎn)程主機(jī)到遠(yuǎn)程登錄服務(wù)器的數(shù)據(jù)幀沒有報(bào)錯(cuò);于是他們得出結(jié)論是操作系統(tǒng)故障。
另一位操作人員查看跟蹤器發(fā)現(xiàn),局域端遠(yuǎn)程登錄會(huì)話連接到端口2323,而遠(yuǎn)程會(huì)話連接到端口23。另外,遠(yuǎn)程登錄服務(wù)器響應(yīng)遠(yuǎn)程連接請(qǐng)求的信息包包含了RST標(biāo)志設(shè)置。在這里,站點(diǎn)操作人員沒有仔細(xì)查看TCP細(xì)節(jié),因此沒有意識(shí)到不同端口號(hào)和RST包的重要性,他們依賴來源于分析器的診斷信息,既然遠(yuǎn)程登錄服務(wù)器的端口23沒有安裝,憑感覺猜想也認(rèn)為是操作系統(tǒng)出了問題。然而,若站點(diǎn)工作人員了解TCP和遠(yuǎn)程登錄,他們就會(huì)立即發(fā)現(xiàn)問題所在并能在5分鐘內(nèi)找到一個(gè)好的解決辦法。
事實(shí)上是,他們等半天時(shí)間來安裝跟蹤器,結(jié)果失去了遠(yuǎn)程網(wǎng)上數(shù)目相當(dāng)可觀的客戶。