發(fā)電機(jī)電磁計算_第1頁
發(fā)電機(jī)電磁計算_第2頁
發(fā)電機(jī)電磁計算_第3頁
發(fā)電機(jī)電磁計算_第4頁
發(fā)電機(jī)電磁計算_第5頁
已閱讀5頁,還剩126頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

I題目:660MW半速核發(fā)電機(jī)電磁計算及優(yōu)化研究方向:指導(dǎo)教師:二0一七年七月自己的代碼。實(shí)現(xiàn)了一個iOS平臺的SDK,開發(fā)者通過嵌入該SDK,并且在應(yīng)用程序代碼中添加TheprosperityofMobileInternetimpulsesthepopularityofmobileapplicationdevelopment.Asoneofthemostimportantplatform,iOShasthousandstohelpusdeveloperstrackcodingis第1章緒論 11.1研究背景 錯誤!未定義書簽。1.2發(fā)展現(xiàn)狀 錯誤!未定義書簽。1.3研究意義 錯誤!未定義書簽。 3 42.1需求分析 42.1.1功能需求 42.1.2非功能性需求 62.2同類產(chǎn)品調(diào)研 6 6 7 8 錯誤!未定義書簽。3.1系統(tǒng)總體結(jié)構(gòu) 3.2系統(tǒng)技術(shù)方案 3.2.1系統(tǒng)開發(fā)語言與環(huán)境 3.2.2開發(fā)環(huán)境隔離 3.2.3自動化代碼部署 3.3.1Conch子系統(tǒng) 3.3.2Hairtail子系統(tǒng) 3.3.3Crab子系統(tǒng) 3.4系統(tǒng)業(yè)務(wù)流程 263.5項(xiàng)目預(yù)期成果 3.6本章小結(jié) 錯誤!未定義書簽。4.1關(guān)鍵技術(shù) 4.1.1崩潰收集與傳回 4.1.2實(shí)時堆棧符號化 4.1.3符號化工具實(shí)現(xiàn) 4.2Mach-O格式 4.2.1Mach-O簡介 4.2.2Mach-0文件結(jié)構(gòu) V 4 錯誤!未定義書簽。5.1Conch子系統(tǒng) 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。 5.2.1文件獲取 5.2.3文件及額外信息的傳回 5.3Crab子系統(tǒng) 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。5.4Pier子系統(tǒng) 錯誤!未定義書簽。5.5Mussel子系統(tǒng) 錯誤!未定義書簽。 錯誤!未定義書簽。5.6子系統(tǒng)整合 錯誤!未定義書簽。 錯誤!未定義書簽。5.6.2使用Nginx服務(wù)器…………錯誤!未定義書簽。6.2.1SDK的嵌入………………錯誤!未定義書簽。6.2.2安裝Hairtail應(yīng)用程序……錯誤!未定義書簽。錯誤!未定義書簽。6.4預(yù)期結(jié)果…………錯誤!未定義書簽。6.5測試結(jié)果……………錯誤!未定義書簽。6.5.1功能測試結(jié)果………………錯誤!未定義書簽。6.6本章小結(jié)……………錯誤!未定義書簽。 錯誤!未定義書簽。7.1總結(jié) 錯誤!未定義書簽。7.2展望 錯誤!未定義書簽。 1.1附錄1 致謝 6圖表目錄 9 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。圖5.7崩潰概覽圖 錯誤!未定義書簽。圖5.8崩潰統(tǒng)計分析圖 錯誤!未定義書簽。圖5.9崩潰堆棧圖 錯誤!未定義書簽。圖5.10應(yīng)用程序設(shè)置圖 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。圖6.6崩潰描述信息圖………錯誤!未定義書簽。圖6.7崩潰詳細(xì)堆棧信息圖…………………錯誤!未定義書簽。 錯誤!未定義書簽。 錯誤!未定義書簽。圖6.11崩潰報告處理(開始)圖 錯誤!未定義書簽。圖6.12崩潰報告處理(結(jié)束)圖 錯誤!未定義書簽。 表4-3模塊DIE常見屬性 表4-4子程序DIE常見屬性 1第1章緒論天都有成千上萬個移動端應(yīng)用程序上架。并且隨著人們對于應(yīng)用程序付費(fèi)意識的增可能多達(dá)幾億用戶。然而,有程序開發(fā)就意味著會有存在潛在Bug的可能,并且由于最終用戶眾多,程序中一個小小的Bug都可能會導(dǎo)致其在成千上萬臺移動設(shè)備上國內(nèi)過去設(shè)計制造的汽輪發(fā)電機(jī)大都是全速的,半速與全速汽輪發(fā)電機(jī)的設(shè)計原汽輪發(fā)電機(jī)的設(shè)計研究起到了引導(dǎo)作用,有一定的參考價值。2例如法國為76.2%、斯洛伐克56.4%、比利時為53.8%、瑞典為42%、瑞士為39.2%、匈計制造能力,在核電汽輪發(fā)電機(jī)設(shè)計制造方面技術(shù)領(lǐng)先的公司有美國GE公司、瑞士在核電半速汽輪機(jī)的設(shè)計、制造方面有著大量成熟的經(jīng)驗(yàn)和運(yùn)行業(yè)績,國內(nèi)大公司都1.2.2國內(nèi)發(fā)展現(xiàn)狀一輪核電發(fā)展的“核”心動力。我國在上個世紀(jì)90年代建設(shè)了秦山第二核電廠、秦的電力事業(yè)做出貢獻(xiàn)。所以國家發(fā)展與改革核電“遠(yuǎn)景規(guī)劃”,遠(yuǎn)景目標(biāo)是到本世紀(jì)20年代末,我國核能發(fā)電裝機(jī)容量將達(dá)到3600萬kW。這個規(guī)劃實(shí)際上意味著,我國每年將至少批準(zhǔn)建設(shè)2個1000MW級核電機(jī)組。目前正在進(jìn)行前期工作的核電項(xiàng)目有:廣東的嶺澳二期(嶺東)、陽江核電項(xiàng)目;三門這兩個核電項(xiàng)目已經(jīng)批準(zhǔn)立項(xiàng)。除此以外還有其他幾個省份也在籌劃核電項(xiàng)目。核能是21世紀(jì)能源的主要支柱之一,作為國家重點(diǎn)發(fā)展的高新技術(shù)和能源領(lǐng)域,具有廣闊的發(fā)展前景。根據(jù)有關(guān)報道我國計劃在未來15年內(nèi)建設(shè)30座1000MW級核電機(jī)組,使核能在我國得以更廣泛深入的利用,從而調(diào)整能源結(jié)構(gòu)。級大型汽輪發(fā)電機(jī)開發(fā)設(shè)計研究”,項(xiàng)目負(fù)責(zé)人為丁舜年院士、汪耕院士,負(fù)責(zé)單位3這次對1000MW級汽輪發(fā)電機(jī)的電磁方案計算、機(jī)械強(qiáng)度應(yīng)力分析和各專題研究員,能對聯(lián)合設(shè)計起很好的作用,為自主研制奠定基礎(chǔ)。目前我國已經(jīng)具備開發(fā)、設(shè)計和建設(shè)30萬kW級和60萬kW級核電站的能力,但在1000MW級核電機(jī)組的技術(shù)、設(shè)計與制造等方面尚處于開發(fā)研究階段[12]。由于2020年前我國要投資興建核電汽輪發(fā)電機(jī)技術(shù)及其成熟的運(yùn)行經(jīng)驗(yàn)。根據(jù)核電市場新的需求,該公司于2004年派出人員與SWPC聯(lián)合優(yōu)化設(shè)計1300MW核電用汽輪發(fā)電機(jī)[13],并已完成方案設(shè)計。預(yù)計2010年前,1000MW核電機(jī)組投運(yùn)并國產(chǎn)化,2010年后發(fā)展機(jī)組,2030年發(fā)展20001.提出了模擬汽輪發(fā)電機(jī)穩(wěn)態(tài)運(yùn)行的新方法。本文提出了一種基于Ansoft/Maxwell外電路每相繞組中施加等效負(fù)載阻抗模擬2.轉(zhuǎn)子磁路結(jié)構(gòu)對半速汽輪發(fā)電機(jī)參數(shù)的影響。轉(zhuǎn)子磁路結(jié)構(gòu)的變化包括轉(zhuǎn)子槽分度數(shù)的變化;轉(zhuǎn)子采用小槽結(jié)構(gòu);轉(zhuǎn)子采用偏槽結(jié)構(gòu)。本文工作內(nèi)容之一就是對1000MW級半速汽輪發(fā)電機(jī)在不同轉(zhuǎn)子磁路結(jié)構(gòu)情況下應(yīng)用Ansoft/Maxwell對電機(jī)進(jìn)行磁場分析[14],得到發(fā)電機(jī)的磁場分布、電抗的原因。3.對汽輪發(fā)電機(jī)電指計算程序進(jìn)行修正。我國普遍使用的汽輪發(fā)電機(jī)電磁方案設(shè)計計算公式—機(jī)械工業(yè)部電工專業(yè)指導(dǎo)4機(jī)的設(shè)計經(jīng)驗(yàn),通過在計算公式中加入轉(zhuǎn)子偏在對(DZ)28-63修正的基礎(chǔ)上,應(yīng)用VB與Matlab混合編程把修正后的“DZ”編第2章提出模擬汽輪發(fā)電機(jī)穩(wěn)態(tài)運(yùn)行新方法本系統(tǒng)需要支持崩潰報告的收集、崩潰統(tǒng)計信息的收集、崩潰處理額外信息(dSYM文件以及dSYM文件類型等)的上傳,崩潰堆棧服務(wù)端符號化、崩潰的聚類2.1需求分析崩潰信息收集1)設(shè)備狀態(tài)信息●操作系統(tǒng)語言5●設(shè)備類型●當(dāng)前網(wǎng)絡(luò)類型●是否在充電●是否內(nèi)存低2)應(yīng)用程序相關(guān)信息●應(yīng)用程序唯一標(biāo)識符●設(shè)備唯一標(biāo)志符●應(yīng)用標(biāo)識符●應(yīng)用版本●應(yīng)用啟動時間●應(yīng)用是否破解3)崩潰相關(guān)信息●崩潰次數(shù)●異常類型崩潰報告的解析與展示4.以餅狀圖、直方圖等可視化方式顯示崩潰相關(guān)的統(tǒng)計數(shù)據(jù)。5.對崩潰進(jìn)行分組聚類,為崩潰分組提供崩潰額外調(diào)試信息,從而讓開發(fā)者了6.做到各種統(tǒng)計報表的自動生成。7.發(fā)送崩潰郵件報告:6a)實(shí)時崩潰報告除了系統(tǒng)的功能性需求,本系統(tǒng)還需滿足系統(tǒng)的非功能性需求,從而使得系統(tǒng)具有易用性、安全性、高可用性等特性,包括以下幾點(diǎn):●服務(wù)端穩(wěn)定可達(dá)。本系統(tǒng)的設(shè)計實(shí)現(xiàn)過程中參考了一些開源社區(qū)項(xiàng)目及商業(yè)項(xiàng)目。通過對這些項(xiàng)目的分析研究,確定了本系統(tǒng)的結(jié)構(gòu)以及發(fā)展方向,其對本系統(tǒng)的設(shè)計與實(shí)現(xiàn)提供了重●QuincyKit?](Hockeyapp的開源實(shí)現(xiàn))QuincyKit是一個開源的iOS及Mac平臺下的崩潰收集系統(tǒng),整個系統(tǒng)的結(jié)構(gòu)與本系統(tǒng)的最終結(jié)構(gòu)類似,對該系統(tǒng)代碼及結(jié)構(gòu)的分析對本系統(tǒng)的設(shè)計與實(shí)現(xiàn)有重大的經(jīng)過調(diào)研分析,發(fā)現(xiàn)QuincKit可以分為以下幾個部分:3.PHP客戶端:用于從服務(wù)端抓取最新的崩潰并進(jìn)行本地符號化。71.新建一個iOS項(xiàng)目,把QuincyKit的Framework嵌入到項(xiàng)目中,指定服務(wù)器端HTTP地址。應(yīng)用程崩潰后,該Framework會通過HTTP請求把崩潰信息2.開發(fā)者在本地Mac開發(fā)機(jī)運(yùn)行QuincyKit的Client端代碼去服務(wù)端獲取所有未處理崩潰,并且調(diào)用Mac本地的atos工具進(jìn)行堆棧二進(jìn)制地址符號化,用生成的符號去替換原崩潰報告中的二進(jìn)制地址,得到最終的結(jié)果崩潰報告供開發(fā)者進(jìn)行分析,原始崩潰報告和目標(biāo)崩潰報告如附錄1、附錄2所示。經(jīng)過調(diào)研發(fā)現(xiàn)發(fā)現(xiàn)其原理為:開發(fā)者在iOS應(yīng)用程序中設(shè)置發(fā)生崩潰時,崩潰信調(diào)用HTTP請求把產(chǎn)生的崩潰發(fā)送給目標(biāo)QuincyKit服務(wù)端。服務(wù)端做最簡單的聚類分析之后把崩潰存儲在MySQL數(shù)據(jù)庫中。PHPServer端抓取所有未處理崩潰并調(diào)用Xcode中自帶的symbolicatecrash.pl腳本來解析該崩潰報告。該P(yáng)erl腳本如果找到合適的符號表文件就會調(diào)用Mac下的atos命Crashlytics的用戶體驗(yàn)做得很好,一切以方便開發(fā)者使用為目的,讓開發(fā)者可以的指引者。調(diào)研過程中發(fā)現(xiàn)的如下幾點(diǎn)使得本系統(tǒng)的設(shè)計過程提前考慮了很多因素:●Crashlytics包括崩潰收集的URL在內(nèi)的多項(xiàng)配置都是在啟動SDK時候的從服務(wù)器上請求得到的,這樣可以實(shí)現(xiàn)動態(tài)配置功能?!馛rashlytics的多個崩潰是單個發(fā)送的。(本系統(tǒng)的最初的設(shè)計是當(dāng)有多個崩潰時,把所有崩潰報告寫入同一個文件,并且下一次運(yùn)行時,把所有的崩潰報告通過一次HTTP請求全部發(fā)送給服務(wù)器,從而節(jié)省發(fā)送時間。但是由于多個崩潰導(dǎo)致需要與服務(wù)器進(jìn)行長時間的通信,導(dǎo)致崩潰數(shù)量越多,越難成功發(fā)送,影響開發(fā)者應(yīng)用程序的性能。8●Crashlytics除了在URL和崩潰報告中包含了APPToken,在請求里還包含●同一個崩潰文件中包含大量<redacted>符號。經(jīng)過調(diào)研發(fā)現(xiàn),從iOS6開始,進(jìn)行客戶端本地符號化時,并不能得到某些系統(tǒng)級Framework的符號信息,會統(tǒng)一返回<redacted>符號,導(dǎo)致客戶端無法做到完全符號化系統(tǒng)庫。因此系統(tǒng)需要在服務(wù)端對<redacted>符號進(jìn)行處理。QuincyKit系統(tǒng)中底層的崩潰收集使用了開源框架PLCrashReporter。該開源框架●僅使用公開的APIs、ABIs收集崩潰,避免了因?yàn)槭褂梅枪_APIs,導(dǎo)致應(yīng)用程序不能在AppStore上架?!窨梢允占羞\(yùn)行線程的崩潰信息?!窨梢蕴幚砦床东@的Objective-C異常及其他FatalSignals(SIGSEGV,SIGBUS等)?!褡鳛橐粋€最底層的服務(wù),可以方便容易的嵌入已有的崩潰報告服務(wù)中?!窨梢杂涗洷罎r完整的寄存器的狀態(tài)。PLCrashReporter開源框架基本滿足本系統(tǒng)對SDK功能方面的需求,并且由于開放源代碼,因此容易進(jìn)行定制。結(jié)合本系統(tǒng)的需求分析以及對同類產(chǎn)生的調(diào)研,本文對系統(tǒng)做了如下設(shè)計:本系統(tǒng)命名為EGG系統(tǒng),含義為對開發(fā)者的應(yīng)用程序進(jìn)行照料、孵化。整個系和Mussel子系統(tǒng)。如圖2.1所示:9其中Hairtail從開發(fā)者開發(fā)機(jī)收集應(yīng)用程序編譯產(chǎn)生的文件發(fā)送給Crab,Conch從最終用戶iOS設(shè)備收集崩潰信息發(fā)送給Crab。Crab接收到二者發(fā)送的數(shù)據(jù)并進(jìn)行分析處理,其中涉及到的業(yè)務(wù)數(shù)據(jù)存儲在MySQL中,需要緩存的數(shù)據(jù)存儲在Redis中,需要進(jìn)行統(tǒng)計分析的數(shù)據(jù)存入Mussel中,并且使用RabbitMQ作為系統(tǒng)消息隊列。開發(fā)者通過PierWeb界面登錄本系統(tǒng)查看應(yīng)用程序的崩潰數(shù)據(jù)和統(tǒng)計信息。本系統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu)圖如下:0S設(shè)備iOS設(shè)備10S設(shè)備其中,HairtailMac應(yīng)用程序安裝在開發(fā)者M(jìn)ac開發(fā)機(jī)上,在開發(fā)者編譯應(yīng)用程序的時候把本次編譯產(chǎn)生的文件發(fā)送給服務(wù)端。最終用戶在iOS設(shè)備上安裝開發(fā)者已經(jīng)嵌入Conch的應(yīng)用程序,如果程序運(yùn)行崩潰,那么在應(yīng)用程序下次啟動時,SDK會把上次運(yùn)行產(chǎn)生的崩潰報告發(fā)送給服務(wù)端。Nginx服務(wù)器作為系統(tǒng)的外部接口轉(zhuǎn)發(fā)所有請求。如果請求來自Hairtail或者Conch,那么轉(zhuǎn)發(fā)給Crab服務(wù)器,否則轉(zhuǎn)發(fā)給Pier服務(wù)器。Crab服務(wù)器響應(yīng)請求時會把崩潰有關(guān)數(shù)據(jù)寫入MySQL數(shù)據(jù)庫服務(wù)器,把統(tǒng)計數(shù)據(jù)寫入Mussel服務(wù)器,處理過程中產(chǎn)生的需要緩存的信息寫入緩存服務(wù)器,所有和異步任務(wù)有關(guān)的任務(wù)都會寫入消息存儲服務(wù)器,由后端Worker進(jìn)行處理。開發(fā)者查看崩潰信息的請求經(jīng)過Nginx服務(wù)器轉(zhuǎn)發(fā)給Pier服務(wù)器,Pier子系統(tǒng)從MySQL服務(wù)器和Mussel服務(wù)器獲取有關(guān)信息后通過Web頁面展示給開發(fā)者。Conch是一個iOS平臺的SDK,用于崩潰報告的收集。Hairtail是一個Mac平臺的應(yīng)用程序,用于從開發(fā)者本地開發(fā)機(jī)收集應(yīng)用程序編譯時產(chǎn)生的dSYM文件、應(yīng)用程序圖標(biāo)、編譯額外信息等。Crab是崩潰處理的服務(wù)端,用于對崩潰報告進(jìn)行解析、符號化、聚類分析等功Pier用于其他業(yè)務(wù)邏輯,例如:用戶邀請、用戶注冊、崩潰信息展示等。Mussel類似一個數(shù)據(jù)倉庫,存儲所有需要用于統(tǒng)計分析的崩潰信息。系統(tǒng)中各個子系統(tǒng)通過Internet進(jìn)行交互,降低了各子系統(tǒng)之間的耦合度,其交互流程圖如圖2.2所示:求第3章轉(zhuǎn)子磁路結(jié)構(gòu)對半速汽輪發(fā)電機(jī)參數(shù)上文把本系統(tǒng)分為了五個子系統(tǒng):Conch子系統(tǒng)、Hairtail子系統(tǒng)、Crab子系統(tǒng)、Pier子系統(tǒng)和Mussel子系統(tǒng)。本章將介紹系統(tǒng)的總體結(jié)構(gòu)、系統(tǒng)使用的技術(shù)方案、各子系統(tǒng)的詳細(xì)設(shè)計、系統(tǒng)業(yè)務(wù)流程及項(xiàng)目預(yù)期成果。本系統(tǒng)的總體結(jié)構(gòu)如圖3.1所示,整個系統(tǒng)分為客戶端和服務(wù)端兩個部分:子系統(tǒng)統(tǒng)系統(tǒng)統(tǒng)數(shù)據(jù)庫據(jù)庫Hairtail子系統(tǒng)從開發(fā)者開發(fā)機(jī)上收集信息,Conch子系統(tǒng)從iOS設(shè)備上收集信息。然后通過Nginx網(wǎng)絡(luò)入口發(fā)送給服務(wù)端。Nginx根據(jù)請求類型轉(zhuǎn)發(fā)給Crab子系統(tǒng)或者Pier子系統(tǒng)。Crab子系統(tǒng)和Pier子系統(tǒng)與Mussel子系統(tǒng)和系統(tǒng)其他存儲部分3.2.1系統(tǒng)開發(fā)語言與環(huán)境1.Conch子系統(tǒng)和Hairtail子系統(tǒng)使用Objective-C進(jìn)行開發(fā)。2.Crab子系統(tǒng)和Pier子系統(tǒng)使用Python進(jìn)行開發(fā),并使用MySQL存儲業(yè)務(wù)數(shù)據(jù)。6.所有子系統(tǒng)都運(yùn)行在AmazonEC2虛擬服務(wù)器上。3.2.2開發(fā)環(huán)境隔離Python的pip工具安裝virtualenv,通過命令行調(diào)用virtualenv--no-site-packages環(huán)境中的Python,之后通過envbin/pip安裝軟件包就會把所安裝的軟件包都安裝在該虛擬環(huán)境中。3.2.3自動化代碼部署為了方便代碼的部署,系統(tǒng)使用了Python社區(qū)中比較流行的代碼部署工具庫和命令行工具,用于加快代碼部署和系統(tǒng)管理。它3.3各子系統(tǒng)詳細(xì)設(shè)計3.3.1Conch子系統(tǒng)Conch以iOSSDK的形式嵌入到應(yīng)用程序中,開發(fā)者僅僅需要在應(yīng)用程序中添加一小段代碼以及簡單的配置就可以實(shí)現(xiàn)崩潰信息的自動化收集與處理。功能設(shè)計說明小段代碼以及少量的配置,就可以實(shí)現(xiàn)崩潰信息的自動收集與發(fā)送。每當(dāng)于Bug閃退之后,用戶下一次運(yùn)行該應(yīng)用程序并且網(wǎng)絡(luò)可用時就會自動把該崩潰發(fā)經(jīng)過調(diào)研,友盟、百度移動統(tǒng)計的SDK使用的都是靜態(tài)庫文件,而Xcode項(xiàng)目開中常用的是Framework形式的庫。因此系統(tǒng)有必要給出一個Framework格式的SDK方便用戶使用。但是目前Apple還不支持創(chuàng)建iOS平臺上的Framework,為了使得開發(fā)者開發(fā)過程更加方便,本系統(tǒng)使用一個折中的方法(創(chuàng)建FrameworkforioS?])把iOS上的靜態(tài)庫和頭文件完美打包成一個Framework,通過這個方法,把SDK導(dǎo)出為一個Framework給開發(fā)者拖拽使用。業(yè)務(wù)算法邏輯●崩潰信息的收集:從頭編寫或者使用開源的崩潰信息收集底層框架,實(shí)現(xiàn)崩●統(tǒng)計信息的收集:在崩潰之前以監(jiān)聽設(shè)備狀態(tài)的形式記錄各類統(tǒng)計信息并寫入某文件,如果程序崩潰,那么下次啟動時讀取該統(tǒng)計信息文件。1)文件名前綴2)編程接口3)版權(quán)信息4)命名沖突由于Conch子系統(tǒng)是一個SDK,很容易與開發(fā)者應(yīng)用程序中的代碼產(chǎn)生命名沖每次開發(fā)者使用Xcode進(jìn)行編譯時都會產(chǎn)生相應(yīng)版本的IPA文件和dSYM文本的dSYM文件,因此本系統(tǒng)需要收集編譯過程中產(chǎn)生的所有dSYM文件及dSYM●文件的獲?。好看伍_發(fā)者使用Xcode進(jìn)行編譯時都去獲取本次編譯產(chǎn)生的代碼特性Hairtail代碼風(fēng)格需要遵守AppleMac應(yīng)用程序官方的開發(fā)規(guī)范,并且確保不會Crab是本系統(tǒng)的核心服務(wù),接收Conch和Hairtail發(fā)送的崩潰報告、dSYM文以收到dSYM文件后對dSYM文件進(jìn)行統(tǒng)計解壓縮、目錄分析等操作,并把分析結(jié)果存入MySQL中,留待崩潰報告符號化時使用。收到崩潰報告之后對崩潰報告做一定的處理與分析,處理的具進(jìn)行堆棧二進(jìn)制地址符號化,把分析的結(jié)果存儲在MySQL,把需要統(tǒng)計的信息發(fā)送給Mussel子系統(tǒng)。由于MacOSX下符號化過程所需的atos工具并不是開源的,而Linux下的符號具用于符號化過程,該程序要能部署到Linux系統(tǒng)上。Crab分為Dispatcher和Worker兩個部分。每當(dāng)Dispatcher接收到一個崩潰報告或者dSYM文件之后把該處理任務(wù)放入系統(tǒng)的任務(wù)池。系統(tǒng)中空閑的Worker不斷地從任務(wù)池中取任務(wù)進(jìn)行處理。如圖3.2所示崩潰報告、用圖標(biāo)等潰提醒解析Workerworker解析前潰日報WorkerWorkerWorker圖3.2Crab子系統(tǒng)結(jié)構(gòu)圖每當(dāng)Dispatcher接收到一個來自iOS客戶端的請求,一旦崩潰Dispatcher會給SDK返回正確處理標(biāo)志,這樣客戶端就會刪除存儲在iOS設(shè)備本地每當(dāng)Dispatcher接收到一個來自Hairtail發(fā)送的dSYM文件以及對應(yīng)的AppToken(用于區(qū)分不同的應(yīng)用程序),Dispatcher會把該dSYM文件臨時存起來,并在任務(wù)池中添加一個dSYM文件處理任務(wù)由Worker進(jìn)行處理。本系統(tǒng)使用Celery[10的異步任務(wù)調(diào)用功能,在Dispatcher模塊以異步調(diào)用的方式統(tǒng)首先使用Python的XML解析庫從XML中抽取崩潰統(tǒng)計信息以及崩潰日志。的應(yīng)用程序,進(jìn)而判斷應(yīng)用程序的狀態(tài)以及付費(fèi)情況(未實(shí)現(xiàn))等。在對該崩潰報告1.0(alpha),BuildVersion是應(yīng)用程序的編譯版本號。因?yàn)閄code每次編譯產(chǎn)生的應(yīng)用程序都會具有不同的UUID,系統(tǒng)根據(jù)該UUID來匹配崩潰報告與dSYM版本。2)dSYM解析任務(wù)每當(dāng)Hairtail發(fā)送一個dSYM文件到Crab,Crab都會在系統(tǒng)任務(wù)池添加一個dSYM文件處理任務(wù)用于解析該文件。由于Hairtail端對dSYM文件進(jìn)行了壓縮,因此Worker的第一步就是判斷上傳的文件是否為Zip文件,如果不是的話那么丟棄,是的話就繼續(xù)處理。每個dSYM文件夾中都有一個info.dSYM文件對應(yīng)的應(yīng)用程序的版本,應(yīng)用標(biāo)識符等信息,因此通過這些信dSYM中的Mach-O文件中的UUID信息,就能確定該dSYM對應(yīng)的BuildVersion,其中包含了Framework的額外信息,例如版本號,標(biāo)識符等5)數(shù)據(jù)定時清理任務(wù)1百萬臺iOS設(shè)備上發(fā)生,那么將會占用大約100G的硬盤空間,這無疑是對系統(tǒng)存制工具進(jìn)行代碼提交,代碼Merge等操作。隨著一個iOS開應(yīng)用的dSYM文件會有5M左右,假設(shè)每天有1千次編譯就會導(dǎo)致1千個dSYM文件的上傳,所以一個典型的iOS項(xiàng)目每天可能會產(chǎn)生5G以上的dSYM文件。隨著EGG崩潰收集與處理系統(tǒng)用戶量的逐漸增多,1000個應(yīng)用程序,每天就會產(chǎn)生5T為了解決這個問題,系統(tǒng)起初的策略是,只保留最新的100個dSYM文件,每應(yīng)的dSYM文件的時候,發(fā)現(xiàn)該文件已經(jīng)被刪除了。如果系統(tǒng)把開發(fā)者提交到Appa.如果在2個小時內(nèi)沒有收到任何與當(dāng)前dSYM文件相關(guān)的崩潰報告,b.如果之前有收到若干個與當(dāng)前dSYM有關(guān)的崩潰報告,但是最近2個2.Release編譯(模擬機(jī)/真機(jī))a.三個月內(nèi)沒有收到任何與當(dāng)前dSYM文件相關(guān)的崩潰報告,那么給當(dāng)b.之前有收到與當(dāng)前dSYM文件相關(guān)的崩潰報告1)指令集支持●ARM系列2)64比特支持雖然目前大部分的iOS設(shè)備都是32位處理器,但是2013年推出的iPhone5S將成為首款搭載64位ARM處理器的iOS設(shè)備,因此atos需要支持對64比特的DWARFarm,二者皆為小端模式。而目前系統(tǒng)服務(wù)器所使用的也是小端模式,但是鑒于未來系統(tǒng)可能運(yùn)行在各種處理器架構(gòu)下,所以本系統(tǒng)還解決了大端模式下的Mach-O/DWARF解析問題。由于atos工具過于底層,因此本系統(tǒng)選擇使用C語言進(jìn)行開發(fā),但是使用C語言就涉及到內(nèi)存的回收利用,所有的malloc都必須對應(yīng)一個free,經(jīng)過一系列的測試研究,終于解決了所有的內(nèi)存回收問題。但是由于atos程序只用來進(jìn)行符號化過程,而在程序結(jié)束的時候操作系統(tǒng)會自動回收相應(yīng)的內(nèi)存,因此即使有內(nèi)存泄露也不會有很大的問題,但是本著優(yōu)雅退出的原則,本系統(tǒng)還是對內(nèi)存泄露問題進(jìn)行測試,確保不會有內(nèi)存泄露問題。由于C語言寫代碼容易出錯,而且atos進(jìn)行的都是底層的操作,因此大部分情況下atos運(yùn)行時都需要進(jìn)行一部分輸出以便調(diào)試,但是由于符號化腳本是通過讀取atos標(biāo)準(zhǔn)輸出的方式獲得符號化結(jié)果,如果atos直接在命令行輸出調(diào)試信息會影響符號化腳本的解析。因此使用過程中經(jīng)常需要在二者之間切換。為了解決這個問題本系統(tǒng)通過使用宏的方式實(shí)現(xiàn)了調(diào)試模式,編譯的時候加上-DDebug標(biāo)志就可以生成調(diào)試模式下的可執(zhí)行文件,不加的話生成Release版本,此時會把所有的調(diào)試信息刪除,只輸出最后的符號信息。Pier為本系統(tǒng)提供業(yè)務(wù)邏輯以及崩潰展示服務(wù),用于實(shí)現(xiàn)用戶注冊、崩潰信息展目標(biāo)Pier子系統(tǒng)需要提供Web界面及相應(yīng)的后端邏輯代碼從而實(shí)現(xiàn)一般用戶操務(wù)邏輯:●用戶相關(guān)業(yè)務(wù)邏輯:用戶注冊、用戶邀請、用戶信息更改、用戶刪除、用戶角色等功能?!駪?yīng)用程序相關(guān)業(yè)務(wù)邏輯:應(yīng)用程序創(chuàng)建、應(yīng)用程序刪除、應(yīng)用程序設(shè)置等功●崩潰顯示相關(guān)業(yè)務(wù)邏輯:展示崩潰統(tǒng)計信息,崩潰分組信息、崩潰堆棧信息Web技術(shù)實(shí)現(xiàn)相應(yīng)的后端邏輯。Pier代碼風(fēng)格需要遵守Python語言開發(fā)風(fēng)格,做到代碼簡潔、易于維護(hù)。3.3.5Mussel子系統(tǒng)周內(nèi)的崩潰報表,一個月內(nèi)的崩潰報表等。目標(biāo)Mussel系統(tǒng)要能根據(jù)用戶需要實(shí)時產(chǎn)生各種統(tǒng)計信息,并確保分布式擴(kuò)展性和高可用性。Mussel子系統(tǒng)使用Elasticsearch作為底層的統(tǒng)計分析框架,接收Crab系統(tǒng)發(fā)送系統(tǒng)獲取及展示。業(yè)務(wù)算法邏輯使用Python編程語言調(diào)用ElasticsearchAPI對Elasticsearch中的數(shù)據(jù)進(jìn)行操作。●當(dāng)用戶在Pier端創(chuàng)建應(yīng)用程序的時候自動在Elasticsearch中生成一個新的數(shù)據(jù)Index(類似傳統(tǒng)數(shù)據(jù)庫中的數(shù)據(jù)庫)用于存儲所有與該應(yīng)用程序有關(guān)的統(tǒng)計信息,當(dāng)用戶刪除該應(yīng)用程序時自動刪除Elasticsearch中該應(yīng)用程序?qū)?yīng)Index中的所有數(shù)據(jù),刪除后的項(xiàng)目若仍然有崩潰進(jìn)來,直接丟棄?!駥τ诿總€應(yīng)用程序,還需要根據(jù)篩選條件生成條件下的崩潰總數(shù)、影響設(shè)備數(shù),各操作系統(tǒng)版本下的崩潰分布等統(tǒng)計信息,從而讓用戶更好的理解崩潰的統(tǒng)計分布情況。代碼特性Mussel代碼風(fēng)格需要遵守Python語言的開發(fā)風(fēng)格,做到代碼簡潔、易于維護(hù)。3.3.6子系統(tǒng)數(shù)據(jù)交互本系統(tǒng)的實(shí)現(xiàn)過程中還涉及各子系統(tǒng)之間的數(shù)據(jù)交互,其數(shù)據(jù)交互過程如圖3.3和圖標(biāo)潰日報數(shù)翁繳接鬟套崩潰XML圖3.3系統(tǒng)數(shù)據(jù)流圖首先,開發(fā)者嵌入ConchSDK并且進(jìn)行編譯,MacAppHairtail把對崩潰分析必留待下次收到崩潰時使用。將連接Crab子系統(tǒng),把崩潰報告發(fā)送給Crab子系統(tǒng)。Crab子系統(tǒng)收到崩潰報告后,對原始的崩潰報告內(nèi)容進(jìn)行解析,崩潰報告內(nèi)容見附錄1,根據(jù)從崩潰報告中得到的數(shù)據(jù)特征(如文件名和行號、方法和方法偏移等)對崩潰進(jìn)行聚類分組,并且把業(yè)務(wù)首先開發(fā)者通過Pier進(jìn)行用戶賬號注冊,并且新一個項(xiàng)目,安裝HairtailMacApp。1)崩潰收集會生成一個崩潰信息文件,存儲在用戶的設(shè)備上。2)崩潰的發(fā)送3)崩潰的處理潰報告。4)崩潰的分析提醒。5)崩潰的統(tǒng)計給開發(fā)者。6)崩潰的展示本課題所期望的成果是一個方便好用、完善的崩潰收集與處理系統(tǒng)。其中包括以下5個子系統(tǒng):供開發(fā)者嵌入應(yīng)用程序中,開發(fā)者在應(yīng)用程序中加入一小段代碼及少量的配置。應(yīng)用程序崩潰后,SDK會自動保存崩潰堆息,寄存器狀態(tài)、崩潰原因等信息。在用戶下次打開應(yīng)用程序,網(wǎng)絡(luò)可用的情況下自動發(fā)送崩潰報告給Crab子系統(tǒng)。第二個是Hairtail子系統(tǒng),開發(fā)者從本系統(tǒng)Pier端網(wǎng)站下載安裝Hairtail后,每次開發(fā)者使用Xcode編譯iOS應(yīng)用程序,Hairtail都會自動保存崩潰符號化所必須的dSYM文件并且上傳到Crab子系統(tǒng),用于之后的符號化過程。第三個是Crab子系統(tǒng),用于崩潰信息的輸入。功能如下:1.接收開發(fā)者開發(fā)機(jī)發(fā)送的dSYM文件,進(jìn)行預(yù)處理分析后存入文件系統(tǒng)。2.接收SDK發(fā)送的崩潰報告,啟動一個后端任務(wù)分析此崩潰。3.后端任務(wù)解析崩潰報告,從中抽取所有的二進(jìn)制地址,調(diào)用符號化腳本進(jìn)行符號化,得到目標(biāo)崩潰報告。符號化的結(jié)果使用緩存服務(wù)進(jìn)行緩存,以加快4.對崩潰堆棧進(jìn)行分析,例如,高亮用戶代碼行,按照文件名和行號進(jìn)行聚類5.定期進(jìn)行數(shù)據(jù)清理,去除老舊的dSYM文件和崩潰報告,節(jié)省服務(wù)器端資源。第四個是Pier子系統(tǒng),用于用戶注冊、用戶邀請、崩潰展示等業(yè)務(wù)邏輯。第五個是Mussel子系統(tǒng),作為統(tǒng)計服務(wù),用于生成崩潰統(tǒng)計信息。相互協(xié)同工作的方式,并在結(jié)尾處對系統(tǒng)業(yè)務(wù)流程和預(yù)期成果做了分析與闡述。第4章對汽輪發(fā)電機(jī)電指計算程序進(jìn)行修正本章將對系統(tǒng)實(shí)現(xiàn)時使用的一些關(guān)鍵技術(shù)以及系統(tǒng)實(shí)現(xiàn)時用到的相關(guān)資源進(jìn)行4.1關(guān)鍵技術(shù)代碼中的Bug并對崩潰的總體情況有所了解。系統(tǒng)SDK收集崩潰信息和崩潰統(tǒng)計信息后對崩潰堆棧進(jìn)行客戶端符號化,并把崩潰報告標(biāo)準(zhǔn)化為Apple官方崩潰報告格式。最后SDK把該崩潰報告發(fā)送給系統(tǒng)服腳本對崩潰進(jìn)行符號化并且對符號化之后的崩潰和Web頁面展示的方式顯示給開發(fā)者。本系統(tǒng)使用PLCrashReporter開源框架來收集iOS應(yīng)用程序的崩潰信息和崩潰統(tǒng)計信息并對崩潰堆棧進(jìn)行客戶端符號化,在對后使用HTTP連接把崩潰報告發(fā)送給服務(wù)端進(jìn)行統(tǒng)計分析。在本系統(tǒng)中由Conch子本系統(tǒng)使用客戶端本地堆棧符號化與服務(wù)端實(shí)時堆棧符號化相結(jié)合的方式對崩首先SDK在iOS設(shè)備盡可能多的進(jìn)行符號化過程,對于客戶端本地不能進(jìn)行符號化或者由于隱私問題不能得到相應(yīng)符號的二進(jìn)制地址采用服務(wù)端實(shí)時符號化的策略。在服務(wù)端接收到崩潰報告后,如果發(fā)現(xiàn)某些位置需要進(jìn)行符號化(例如:需要在服務(wù)端使用dSYM符號化出文件名和行號、客戶端由于iOS隱私保護(hù)不能得到的符號),則調(diào)用服務(wù)端符號化過程,并且把符號化的結(jié)果替換崩潰報告中的相應(yīng)位置。原始崩潰報告和結(jié)果崩潰報告分別見附錄1和附錄2。由于iOS與MacOSX高度整合,Linux操作系統(tǒng)常用符號化工具并不能處理Mac操作系統(tǒng)的Mach-O格式文件,因此本系統(tǒng)需要實(shí)現(xiàn)一個能在Linux操作系統(tǒng)上符號化iOS調(diào)試信息文件的工具。該工具的實(shí)現(xiàn)需要理解Mach-O文件格式和DWARF文件格式。首先從命令行參數(shù)中確定需要解析的文件及相應(yīng)的架構(gòu),從Mach-O文件中抽取DWARF相關(guān)部分,并且進(jìn)行解析之后,使用命令行參數(shù)確定需4.1.4聚類統(tǒng)計分析進(jìn)行統(tǒng)計分析。例如,把所有同一個源文件里面的崩者根據(jù)源文件進(jìn)行任務(wù)分割。通過這類聚類方式可以幫助開發(fā)者對代碼有整體的了解,從而在適當(dāng)?shù)臅r候?qū)Υ嬖贐ug的源文件進(jìn)行修改甚至重寫。同時本系統(tǒng)還對崩的背景環(huán)境有一定的認(rèn)識,給開發(fā)者盡量多的崩潰元信息。影響的設(shè)備數(shù)量。為了統(tǒng)計崩潰影響的設(shè)備數(shù)標(biāo)識符對該設(shè)備進(jìn)行標(biāo)識。本系統(tǒng)采用了一個開源的實(shí)現(xiàn)SecureUDID11框架,使用同一臺設(shè)備的不同應(yīng)用程序生成的標(biāo)識符是不一樣的,這樣既保護(hù)了設(shè)備隱私也可以由于系統(tǒng)atos工具的時候需要解析Mach-O結(jié)構(gòu),因此對Mach-統(tǒng),如NeXTSTEP,MacOSX和iOS。IPA文件是MacOSX系統(tǒng)下的一個Bundle,即一個目錄,但是這個目錄被Mac特指IPA文件中的Mach-0文件。使用Xcode編譯iOS應(yīng)用程序時會產(chǎn)生2個Mach-O文件,一個是包含在IPA中的可執(zhí)行文件,另一個包含在dSYM中的DW或函數(shù)的符號信息,但是如果想更進(jìn)一步找到行號和文件名的話,那么必須使用iOS平臺上的DWARF調(diào)試信息外層是用Mach-O格式封裝,這與一般的DWARF格式不同,iOS中把一般DWARF格式中的各個部分都被抽取出來放到了Mach-O格式中不同的位置。所以dSYM文件是DWARF和Mach-O結(jié)構(gòu)的混合體,因此系統(tǒng)不能使用Linux下傳統(tǒng)的DWARF格式解析工具解析dSYM文件。4.2.2Mach-O文件結(jié)構(gòu)在每一個Mach-O[12]的起始處都會有一個文件頭,標(biāo)識當(dāng)前文件是否為一個Mach-O文件,這個文件頭還包含了其他基本的文件類型信息,指示了文件的目標(biāo)架構(gòu),并且包含了影響文件解析過程的一些選項(xiàng)標(biāo)識。結(jié)構(gòu)如下:{cputype:指定本文件適用的架構(gòu),包括:●CPU_TYPE_POWERPC:用于基于PowerPC的架構(gòu)。cpusubtype:指定處理器的確切模型。filetype:指定文件類型和對齊方式的整數(shù),可以使用如下值:●MH_OBJECT:中間格式文件的格式?!馦H_BUNDLE:運(yùn)行時加載的代碼,如動態(tài)運(yùn)行庫?!馦H_PRELOAD:特殊用途的不被OSX內(nèi)核加載的可執(zhí)行文件,如:寫2.符號表的位置(用于動態(tài)鏈接)。4.主可執(zhí)行文件引入的符號所在共享庫的名稱。cmd:指定LoadCommand的類型。關(guān)于LoadCommand的類型,見附錄3。cmdsize:指定LoadCommand數(shù)據(jù)結(jié)構(gòu)占用的字節(jié)數(shù)。不同的LoadCommand接著LoadCommand之后是一個或多個Segment的數(shù)據(jù),系統(tǒng)需要這些Segment中。每個Segment包含0個或多個Section,Mach-O文件包含了對應(yīng)于某個架構(gòu)的代碼和數(shù)據(jù)。Mach-O頭結(jié)構(gòu)指明了目標(biāo)的架構(gòu)。這樣操作系統(tǒng)內(nèi)核就能根據(jù)系統(tǒng)實(shí)際架構(gòu)對文件進(jìn)行選擇性加載。Segments和Sections是通過名稱來訪問的。根據(jù)傳統(tǒng),Segments使用兩個下劃線開頭跟上多個大寫字母,例如:_TEXT。Sections也是使用兩個下劃線開頭,但是是以小寫字母命令,例如_text。如果一個可執(zhí)行文件或者調(diào)試信息文件僅支持一種架構(gòu),那么它應(yīng)該是Thin格由于Mac操作系統(tǒng)換過多次硬件架構(gòu),例如,剛開始使用了PowerPC,后來才不同的系列,如ARMV5、ARMV6、ARMV7。Apple為了用戶的一致性體驗(yàn),如果一個應(yīng)用程序同時支持ARMV5、ARMV6處理器下運(yùn)行,那么Xcode中就會把這兩種架構(gòu)下的代碼放在一起組合成一個Fat格式的Mach-O文件。FatMach-O是個復(fù)合Mach-O,頭部指明了包含的若干ThinMach-O的信息,緊隨著是若干個ThinMach-O一致,用于區(qū)分兩種格式,如圖4.2,4.3所示。4.3.1DIE基本信息介紹包含0個或多個子DIE,并且可能包含0個或多個兄弟DIE。能的取值一般包含一類或多類屬性值形式,每一個屬性形式可能會以一種或多種形式表示。例如,一些屬性值由一些“常量數(shù)據(jù)”表示。而此處“常量數(shù)據(jù)”是該屬性所包含的屬性類別的一種。常量數(shù)據(jù)有多種表示方法(例如,1字節(jié),2字節(jié),4字節(jié),8字節(jié))。表4-1[13]為每個屬性可能可能的取值類型及介紹:指向了程序地址空間中的地址。任意數(shù)量字節(jié)的未翻譯的數(shù)據(jù)、1字節(jié)、2字節(jié)、4字節(jié)或者8字節(jié)的未翻譯或者以LEB128編碼的可變長度數(shù)據(jù)。一個比較小的指示屬性存在與否的標(biāo)志。指向一些描述本程序的DIE集合的一些成員。有2種類型的reference。第一種是相對于reference所在的編譯單元(CompilationUnit)開始位置的偏移,并且指向了本編譯單元中的一個DIE。第二種是指向本可執(zhí)行文件或者共享目標(biāo)文件中的DIE的地址。它可能指向當(dāng)前程序中的另一個不同的編譯單元。以Null結(jié)尾的一個或多個字節(jié),存儲在這里面的一般都是可打印的字符串,字符串可能會直接表示在DIE中整的結(jié)構(gòu)。1)編譯單元編譯單元[13]的常見屬性如下表所示:表4-2編譯單元DIE常見屬性…各屬性的作用如下:DW_AT_language:表示編譯單元對應(yīng)的源代碼所用編程語言的常量。如下所示:●...在DIESection中,屬性值是本編譯單元行號信息的第一個字節(jié)在debug_lineSection的偏移。DW_AT_identifier_case:表示本編譯單元對標(biāo)識符大小寫的處理,包括:DW_AT_base_types:屬性值是一個引用,指向另一個編譯單元的DIE,可以被用來指定包含當(dāng)前編譯單元用到的一些basetype所在的編譯單元。2)模塊…DW_AT_name:在模塊有名字的情況下,模塊DIE會有此屬性,用于存儲模塊儲模塊初始化代碼第一條機(jī)器指令的可重定位地址。DW_AT_high_pc:在模塊有初始化代碼的情況下,模塊DIE會有此屬性,它的值指向了初始化代碼最后一條機(jī)器指令的下一個位置的地址。DW_AT_priority:如果一個模塊有優(yōu)先級,模塊DIE可能會有此屬性,屬性值指向另一個用常量值描述一個變量的DIE,變量的值就是模塊的優(yōu)先級。3)子程序子程序DIE的Tag是DW_TAG_subprogram,用于存儲程序中的方法或者函數(shù)信…DW_AT_external:如果子程序在本編譯單元之外依然可見,那么有此屬性,屬DW_AT_type:表示子程序的返回值類型。DW_AT_low_pc:它的值指向了子程序第一條機(jī)器指令的可重定位地址。DW_AT_high_pc:它的值指向了子程序最后一條機(jī)器指令下一個位置的地址。介紹完DWARF的幾個基本概念之后,我們就比較方便理解DWARF中的Section的概念。DWARF包括以下幾個重要的Section。 debugabbrevSection中包含所有TAG的定義,每個TAG都有不同的編號。這樣在別的Section只需要通過TAG編號就能確定DIE的類型。 debuginfoSection中存儲了目標(biāo)代碼的DIE樹狀結(jié)構(gòu)。每個EntrySet描述了某編譯單元所在程序地址空間的一部分。每一個Set由一個包含5個值的頭部開始。該頭部包含以下5個值:1.除該頭部以外的其他部分的總長度。2.版本號。3.該Set指向的編譯單元對于_debug_infoSection開始位置的偏移。4.地址在目標(biāo)架構(gòu)上所占的字節(jié)數(shù)。對于分段尋址,這個是地址偏移部分的大5.目標(biāo)架構(gòu)上段描述符的字節(jié)數(shù),如果目標(biāo)系統(tǒng)是平坦地址空間,這個值將是描述符由對應(yīng)的編譯單元DIE包含的某個Entry正文和數(shù)據(jù)范圍的開始地址及那個范圍的長度。這些描述符由一個空描述符結(jié)尾(開始地址和長度都是0),通過掃描這張表,調(diào)試器可以決定去查看哪一個編譯單元去查找具有相應(yīng)地址的對象的調(diào)試信息為了把源代碼文件中的語句和可執(zhí)行文件/共享文件中的機(jī)器指令地址對應(yīng)起Section中的編譯單元DIE會有對這個Section的引用,從而把編譯單元和相應(yīng)的源代4.3.4源文件信息相關(guān)結(jié)構(gòu)1.源文件名2.源文件行號3.源文件列號4.指令是否為源代碼語句對應(yīng)的第一條指令5.指令是否是基本代碼段的開始但是這樣一個矩陣將會占用大量的硬盤空間,因此DWARF的設(shè)計者使用了2矩陣。因此當(dāng)調(diào)試器需要把機(jī)器碼和源文件語句●基本代碼塊:只在第一條語句進(jìn)入、最后一條語句退出的一系列指令。●Sequence:一系列連續(xù)的目標(biāo)機(jī)器指令。一個編譯單元可能會產(chǎn)生多個序列(即在一個編譯單元中并不是所有的指令都是連續(xù)的)。始化時,寄存器并不是被簡單的賦值為0,而是由DWARF中的StatementProgramPrologue中定義的值來初始化,從而實(shí)現(xiàn)了初始狀態(tài)的可配置化。狀態(tài)機(jī)能識別的指令就是上文提到的StatementProgram。下文將介紹狀態(tài)機(jī)的寄存器、Statement狀態(tài)機(jī)中包含如下幾個寄存器:-address寄存器:編譯器產(chǎn)生的機(jī)器指令對應(yīng)的PC值,初始值為0。-line寄存器:一個無符號整數(shù),指示了行號信息。行號從1開始。如果某個指令無法找到對應(yīng)的源文件行,那么可以返回0。初始值為1。-column寄存器:一個無符號整數(shù),指示了語句對應(yīng)的源文件行的列號。列號從1開始計數(shù)。如果一個語句從行的左邊界開始,那么返回0。-is_stmt:指示當(dāng)前指令是否是語句起始位置。初始值由default_is_stmt值確-basic_block:指示當(dāng)前語句是否是基本代碼塊起始位置。初始值為“false”。-end_sequence:指示當(dāng)前地址是否目標(biāo)機(jī)器指令序列的結(jié)尾之后的第一個字節(jié)。初始值為"false"。佳的效果。DWARF的作者使用StatementProgramPrologue來提供這類配置。優(yōu)點(diǎn)如(某類狀態(tài)機(jī)指令)的空間范圍是10-255,但是如果編譯器開發(fā)者加了一個新的standardopcodes,那么specialopcodes的下界就會增加。所以DWARF的設(shè)計者才會選擇使用StatementProgramPrologue中的opcode_base域來表示第一個spec2.根據(jù)目標(biāo)架構(gòu)的不同,specialopcode意義的最佳選擇是不同的。-version(uhalf):StatementInformation格式的版本標(biāo)識符。-prologue_length:prologue_length域之后直到StatementProgram本身第一個字節(jié)之前的字節(jié)數(shù)。-minimum_instruction_length(ubyte):最小目標(biāo)機(jī)器指令的字節(jié)數(shù)。修改地址寄存器的操作符會把其操作數(shù)乘以這個值。-defaultisstmt(ubyte):isstmt寄存器的初始值。一個簡單的以源代碼程序暗矩陣的每一個條目都代表了語句邊界。一個管道調(diào)度代碼生成器會把這個值設(shè)置為"false",并且會為每一個代表語句邊界的指令產(chǎn)生一個特殊的操作符。line_base(sbyte):此參數(shù)影響了specialopcode的含義,指定了specialcode加到line寄存器的最小值。-line_range(ubyte):此參數(shù)也影響了specialopcode的意思,指定了加到line寄存器的值范圍。(line_base與line_range決定了能加到line寄存器的最大值,如果想要加到line寄存器的值大于這個最大值,那么必須使用一個standard-opcode_base(ubyte):指定了第一個specialopcode的值。-standard_opcode_lengths(arrayofubyte):為每一個standardopcode指定了操作數(shù)的個數(shù)。-include_directories(一系列路徑名):這個序列包含了編譯過程中搜索源文件的所有路徑(包括用戶顯示指定和編譯器默認(rèn)搜索的路徑)。每一個路徑都是絕對路徑或者相對于編譯時工作目錄的相對路徑。編譯時的當(dāng)前目錄是本序列的第一個條目。每一個條目字符串都以空字符結(jié)尾。最后一個條目是一個單獨(dú)的空字符。-file_names(一系列文件名):對于每一個對當(dāng)前編譯單元下的StatementInformation有貢獻(xiàn)的源文件在這個序列中都會對應(yīng)一個條目。每個條目都有StatementProgram用于在狀態(tài)機(jī)執(zhí)行并創(chuàng)建一個代表對應(yīng)編譯單元的矩陣。每一個編譯單元的StatementProgram都以一個StatementProgramPrologue開始,用于對狀態(tài)機(jī)進(jìn)行配置。StatementProgram由狀態(tài)機(jī)指令構(gòu)成。由于狀態(tài)機(jī)是一個簡單的機(jī)器,其語句很資料來源:DWARFDebuggingInfor功能如下:b.用一個無符號整數(shù)乘以StatementProgramPrologue中指定的minimum_instruction_length字段,并且把結(jié)果加到address寄存器中。c.使用狀態(tài)機(jī)寄存器的當(dāng)前值給矩陣加一行。d.把basicblock寄存器設(shè)置為"false"。所有specialopcodes都只做以上4件事情,唯一的不同就是給line和address寄數(shù)以及參數(shù)的含義,StatementProgramPrologue也指明了每一個標(biāo)準(zhǔn)操作碼的目前有9個StandardOpcodes,未來可以通過增加opcode_base的方式增加行,并且把basic_block寄存器設(shè)置為"false"。b.DW_LNS_advance_pc:操作數(shù)為一個無符號LEB128操作數(shù),把該操作數(shù)乘以StatementProgramPrologue中的minimum_instruction_length,并把結(jié)果加到address寄存器中。值加到line寄存器中。file寄存器中。e.DW_LNS_set_column:器進(jìn)行設(shè)置。g.DW_LNS_basic_block:沒有操作數(shù),把basic_block寄存器設(shè)置為“true”。h.DW_LNS_add_pc:沒有操作數(shù),把a(bǔ)ddress寄存器的值加上special用1字節(jié)的specialcode,要增加這個范圍的兩倍的時候,使用DW_LNS_advance_pc和一個spi.DW_LNS_fixed_advaopcode是否溢出,并且需要使用DW_LNS_advance而不能產(chǎn)生3.擴(kuò)展操作指令(extendedopcodes):這類指令包含多種字節(jié)形式。第一個字節(jié)是0。另一個是無符號LEB128整數(shù),給出了指令的字節(jié)數(shù)(不包括第一個0字節(jié)和Size字節(jié))。接下來的字節(jié)就是指令本身。用狀態(tài)機(jī)當(dāng)前值增加一行并且把寄存器都設(shè)置為初始值。每一個StatementProgramSequence都必須以DW_LNE_end_sequence指令結(jié)c.DW_LNE_define_file:需要四個操作數(shù),第一個是一個包含原文件名表了字節(jié)數(shù)的無符號LEB128整數(shù)。地址的遞進(jìn)是通過把目的的地址增加量除以ProgramStatementPrologue的opcode。如果最后的值大于255,那么必須使用standardopcode13]。解碼opcode把specialcode減去opcode_base后再除以line_range后的值加到address寄存器●bdb代碼我們同樣可以在MacOSX操作系統(tǒng)下的`/u在atos工具的實(shí)現(xiàn)過程中,需要讀取Mach-O內(nèi)部的DWARFSegment,因此需該工具用于查看Mach-ODWARF結(jié)構(gòu)內(nèi)容,以人可讀的形式展示Mach-O中的第5章應(yīng)用軟件設(shè)計進(jìn)行介紹,其中包括Conch子系統(tǒng)、Hairtail子系統(tǒng)、Crab子系統(tǒng)、Pier子系統(tǒng)以及Mussel子系統(tǒng)的實(shí)現(xiàn)過程的介紹。本章還對各個子系統(tǒng)的整合方式進(jìn)行了介紹。5.1軟件間的接口技術(shù)Conch子系統(tǒng)是崩潰收集SDK,使用Objective-C編寫,供開發(fā)者嵌入到iOS應(yīng)5.1.1VisualBasic與Matlab的接口技術(shù)5.1.2VisualBasic與Excel的接口技術(shù)生時的網(wǎng)絡(luò)狀態(tài),電池狀態(tài),語言環(huán)境等。前文提到,由于進(jìn)程崩潰時,進(jìn)程的堆??赡芤呀?jīng)破壞,在程序崩潰后只能調(diào)用一些Async-Safe的函數(shù),因此不能調(diào)用iOS系統(tǒng)庫。為了獲得這些信息,需要在程序開始運(yùn)行的時候注冊一些設(shè)備狀態(tài)監(jiān)聽器,每當(dāng)設(shè)備狀態(tài)改變時就去獲取最新的設(shè)備狀態(tài),并且寫入iOS設(shè)備存儲空間,在用戶下一次打開程序的時候去讀取存儲空間里的文件內(nèi)容,并且在合適的時候通送給Crab子系統(tǒng)。關(guān)鍵技術(shù)中提到系統(tǒng)需要獲取設(shè)備標(biāo)識符(UDID,SecureUDID)用于統(tǒng)計受影響初,Apple支持在iOS中使用UDID唯一確定一臺iOS設(shè)備,但是后來由于隱私問題在新版iOS中被禁用。如果開發(fā)者應(yīng)用程序使用了UDID那么將導(dǎo)致開發(fā)者應(yīng)用程序不能在AppStore上架。5.1.3VisualBasic與AutoCADPLCrashReporter收集的崩潰信息以一個二進(jìn)制文件的形式存放在iOS設(shè)備中,客戶端代碼通過調(diào)用PLCrashReporter的API去從該二進(jìn)制文件中抽取程序崩潰時的上下文信息來構(gòu)造Apple官方標(biāo)準(zhǔn)崩潰報告格式,其中包括:處理器型號、操作系統(tǒng)版本、所有線程狀態(tài)、寄存器狀態(tài)、地址空間等。如附錄1所示。其中所有的線程中只有一個線程是當(dāng)前的崩潰線程并且每個線程都有相應(yīng)的調(diào)用堆棧。如下所示:2TestDemo0x000右側(cè)的十六進(jìn)制數(shù)即為符號化過程需要進(jìn)行轉(zhuǎn)換為符號的的二進(jìn)制地址。5.1.4VisualBasic與Ansoft/Ma調(diào)用PLCrashReporterAPI生成Apple官方標(biāo)準(zhǔn)的崩潰報告后,需要通過iOS的HTTP連接把該崩潰報告發(fā)送到Crab子系統(tǒng),并且查看返回值,如果返回值為成功,那么就把該崩潰報告從用戶的設(shè)備上刪除,否則等待下次重新發(fā)送傳。為了最大限度的減少因?yàn)閮?nèi)嵌Conch給開發(fā)者應(yīng)用程序造成的額外負(fù)載,系統(tǒng)使用了iOS的異步隊列,使用GCD創(chuàng)建不同優(yōu)先級的工作隊列,結(jié)合Block的使用,方便快捷的實(shí)現(xiàn)異步處理邏輯,通過給崩潰上傳線程設(shè)置較低優(yōu)先級,實(shí)現(xiàn)最低限度的上傳負(fù)載。Hairtail子系統(tǒng)用于從開發(fā)者開發(fā)機(jī)上傳dSYM文件、應(yīng)用程序圖標(biāo)文件和其他Crab子系統(tǒng),由Crab子系統(tǒng)進(jìn)行解析。5.2.2額外信息獲取一為iDevices真機(jī)編譯關(guān)于dSYM文件的上傳,系統(tǒng)最開始的做法是編寫一個Shell腳本,讓開發(fā)者給項(xiàng)目增加一個BuildPhase,從而添加一個RunScript,這樣開發(fā)者每次編譯完都會去腳本是同步執(zhí)行的(如果使用后臺運(yùn)行的方式Hairtail就無法跟蹤上傳的結(jié)果),Shell腳本的執(zhí)行會占用較長時間,而且在Shell腳本通過CURL上傳dSYM文件時,開發(fā)者不能做任何事情,這樣影響了開發(fā)者體驗(yàn)和開發(fā)效率。編譯時都會通過Shell腳本調(diào)用一個啟動程序Lay,Lay去檢查當(dāng)前Hairtail是否正在運(yùn)行,如果沒有,就去啟動Hairtail。Hairtail每隔2秒就會去前文提到的dSYM的標(biāo)準(zhǔn)路徑去掃描dSYM是否發(fā)生改變(通過比較最近修改時間和MD5值),如果沒有是一個Bundle,因此在上傳時需要對該文件進(jìn)行壓縮,并且在上傳時指定AppToken (這樣才能確定該dSYM文件所屬的應(yīng)用程序)和dSYM文件的額外信息。如果5.3所示系統(tǒng)Hairtail子系統(tǒng)的MacOSX下的應(yīng)用程序圖標(biāo),圖5.4左側(cè)第一個圖標(biāo)為Hairtail在系統(tǒng)狀態(tài)欄的圖標(biāo),可以通過雙擊應(yīng)用程序圖標(biāo)啟動該程序或者由Xcode編譯時自動啟動,啟動后,每當(dāng)發(fā)現(xiàn)特定目錄中出現(xiàn)新的dSYM就會自動上傳到Crab子系統(tǒng),在上傳時,狀態(tài)欄圖標(biāo)會閃爍。Crab子系統(tǒng)作為崩潰收集的服務(wù)端,接受Conch發(fā)送的崩潰報告以及Hairtail發(fā)送的dSYM文件,在服務(wù)端做分析。本子系統(tǒng)使用Python作為開發(fā)語言,Python下有很多很好的Web框架,其中比較有名的有Django、web.py、Pyramid等。筆者選擇了使用Pyramid作為開發(fā)框架,因?yàn)樗∏桑Y(jié)構(gòu)簡單,容易使用。Pier子系統(tǒng)的功能包括用戶注冊、用戶邀請、添加應(yīng)用程序、查看應(yīng)用程序崩潰信息等。本子系統(tǒng)主要使用HTML、CSS、JavaScript進(jìn)行前端頁面開發(fā),使用Python編程語言進(jìn)行后端邏輯代碼編寫。個靈活的強(qiáng)大的開源分布式云實(shí)時搜索和分析引擎,Elasticsearch的特點(diǎn)。實(shí)時性:實(shí)時性在一個涉及到統(tǒng)計分析的系統(tǒng)中十分重要,因?yàn)椴粩嗟挠袛?shù)據(jù)通過系統(tǒng)的業(yè)務(wù)邏輯進(jìn)入系統(tǒng),通過使用Elasticsearch這部分?jǐn)?shù)據(jù)實(shí)時可用。實(shí)時分析:使用了Elasticsearch后,搜索不在只是純文本搜索,Elasticsearch會首先去讀懂?dāng)?shù)據(jù),從而更好的分析數(shù)據(jù)。分布式:Elasticsearch允許起初以很有限的配置啟動業(yè)務(wù),隨著業(yè)務(wù)的增長可以實(shí)現(xiàn)水平地擴(kuò)展業(yè)務(wù)。每當(dāng)需要更多的容量,只需增加更多的結(jié)點(diǎn)。Elasticsearch機(jī)器簇會自動重組系統(tǒng)結(jié)構(gòu),使用新加入的硬件結(jié)點(diǎn)。進(jìn)行隔離,確保數(shù)據(jù)的安全可訪問性。多存儲:一個Elasticsearch族可以存儲多個Index(每個Index類似一個傳統(tǒng)數(shù)據(jù)庫中的數(shù)據(jù)庫),每一個Index都可以被單獨(dú)的查詢或者以組的形式查詢。全文本搜索:Elasticsearch底層使用Lucene提供了很強(qiáng)大的全文本搜索功能,支持多種編程語言(本系統(tǒng)中使用了Python編程語言),支持一個強(qiáng)大的查詢語言(類文檔面向:真實(shí)世界的實(shí)體以JSON文檔的形式存儲在Elasticsearch中,傳遞進(jìn)來的JSON文檔的每個字段都可以被索引,并且在一個簡單的查詢中支持同時查詢多個Index。沖突管理:Elasticsearch支持優(yōu)化的版本控制,從而確保即使數(shù)據(jù)存在沖突,數(shù)據(jù)也不會由于沖突的存在而丟失。RESTFULAPI:Elasticsearch是API驅(qū)動的,幾乎所有的操作都可以以簡單Elasticsearch還包含一個Mapping的概念,類似于傳統(tǒng)數(shù)據(jù)庫中的Schema定義。每一個Index都有一個Mapping,Mapping中不僅定義字段的類型,還定義了字段的索引屬性和索引規(guī)則。Mapping可以被顯示定義也可以在傳遞JSON字符串的時候自5.4.2定轉(zhuǎn)子工程圖Mapping中最為重要的就是定義每個字段的索引屬性和存儲屬性,從而當(dāng)接收到由Crab發(fā)送的JSON字符串之后就可以確定對該字符串的所有字段所執(zhí)行的處理操作。以下代碼為從Crab截取的一小部分代碼。long_not_index={index':'no','store'long_index_store={'store':'yint_not_index={'index':'no','store':'yint_index_store={'store':'yebyte_index_store={'store':'yes','type':'istring_not_index={index':'no','string_not_analyzed={'index':'not_analyzed'string_not_analyzed_store={'index':'not_analyzeddate_index_store={'store'}其中store域用于表示該域是否真正存儲在Elasticsearch的Index中,如果設(shè)置為不存儲在Index中,那么通過直接去JSON字符串中讀取的方式去讀取該字段。index域用于設(shè)置字段索引屬性,設(shè)置為“analyzed”可使該字段被索引,可以被搜索到并且字符串中的內(nèi)容進(jìn)行分析或解析,因此對于文中的字符串字段都設(shè)置為5.4.3有限元分析一鍵求解功能的實(shí)現(xiàn)種位同質(zhì)末全近一烹嵌話一最通中個月最近一舞6新增應(yīng)用分話5圖5.11統(tǒng)計信息圖了Circus[22]工具管理所有的服務(wù)。本文對iOS應(yīng)用程序崩潰信息收集與處理系統(tǒng)的總體設(shè)計、詳細(xì)設(shè)計、使用的工作,最終達(dá)到了項(xiàng)目預(yù)期成果,真正實(shí)現(xiàn)了iOS程序崩潰的自動收集與上傳,服務(wù)待提高。速發(fā)展,崩潰信息統(tǒng)計必將一直服務(wù)所有的開發(fā)者。[1]UMengTeam.UMeng官方網(wǎng)站介紹[EB/OL].,2013/2013-09-29.[2]BaiduTeam.Baidu官方網(wǎng)站介紹[EB/OL].,2013/2013-09-29[3]CrashlyticsTeam.Crashlytics官網(wǎng)介紹[EB/OL].,[4]HockeyappTeam.Hockeyapp官網(wǎng)介紹[EB/OL].,2013/2013-09-29.[5]AndreasLinde.QuincyKit2012/2013-09-29.[6]TestFlightTeam.TestFlight官方網(wǎng)站.[EB/OL].https://testf[7]PlausibleLabs.PLCrashReporter[8]FabricTeam.Fabic官方網(wǎng)站.[EB/OL].,2013/2013-09-29.[9]Oliver.MakingYourOwniPhoneFrameworks.[EB/OL]./2010/05/making-your-own-iphone-framewor2010-05-23/2013-09-29.[10]CeleryTeam.Celery官方網(wǎng)站.[EB/OL].,2013/2013-09-29./blog/category/secureudid,2012-12-23/2013-09-29.http://developer.A/library/mac/#documentation/DeveloperTools/Cntime/Reference/reference.html.2009-02-04/2013-09-29.[EB/OL].http///doc/dwarf-2.0.0.pdf,1993-07-27/2[14]Mach-OView開發(fā)者.Mach-OView文件下載網(wǎng)站.[EB/OL]./projects/machoview/,2013-01-10/2013-09-29.[15]Mach-OLib開發(fā)者.Mach-OLib代碼下載網(wǎng)站.[EB/OL]./pypi/macholib/1.5.1,2013-02-04/2013-09-29.[16]AppleTeam.dwarfdump工具使用文檔.[EB/OL].http://developer.A/library/mac/#documentation/Darwin/Referencerfdump.1.html,2000/2013-09-29.[17]AppleTeam.binutil工具源代碼.[EB/OL]./source/binutils/binutils-20/src/2013-01-29/2013-09-29.[18]AaronBallman.Callonlyasynchronous-safef/confluence/display/seccode/SIG30-C.+Callus-safe+functions+within+signal+handlers,2007-06-10/2013-09-29.http://developer.A/library/mac/#documentation/DeveloperTools/ReSettingRef/1-Build_Setting_Reference/build_setting_ref.html,2010-10-05/201/post/11322114068/real-time-s2012-10-11/2013-09-29.[21]ElasticsearchTeam.Elasticsearch官方網(wǎng)站.[EB/OL].,2013/2013-09-29.[22]CircusTeam.Circus官方網(wǎng)站.[EB/OL]./,2013/2013-09-29.附錄樣例原始崩潰報告:IncidentIdentifier:BADAA5AF-BOF1-4CAB-B7FF-15F8214AE1ABPath:/Users/USER/MyTryConch.app/MyTryConchDate/Time:2013-06-1501:31:56+0000OSVersion:iPhone***Terminatingappduetoun0CoreFoundation1libobjc.A.dylib0x3a539963_objc_e2CoreFoundation0x3278921d3MyTryConch0x00093b6b-[QDCViewControlle4MyTryConch0x00093c65-[QDCViewControllersendCrash2:]+735UI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論