假如再有一次機(jī)會(huì)的命題作文
問題程序:

struct list {
char *item;
struct list *next;
}
/* 這里是main 程序*/
main(argc, argv)
{ … }
缺少的一個(gè)分號(hào)使main() 被定義為返回一個(gè)結(jié)構(gòu)。由于中間的注釋行, 這個(gè)聯(lián)系不容易看出來。因?yàn)橐话闵? 返回結(jié)構(gòu)的函數(shù)在實(shí)現(xiàn)時(shí), 會(huì)加入一個(gè)隱含的返回指針, 這個(gè)產(chǎn)生的main() 函數(shù)代碼試圖接受三個(gè)參數(shù), 而實(shí)際上只有兩個(gè)傳入(這里, 由C 的啟動(dòng)代碼傳入)
拓展
Core,又稱之為Core Dump文件,是Unix/Linux操作系統(tǒng)的一種機(jī)制,對(duì)于線上服務(wù)而言,Core令人聞之色變,因?yàn)槌鯟ore的過程意味著服務(wù)暫時(shí)不能正常響應(yīng),需要恢復(fù),并且隨著吐Core進(jìn)程的內(nèi)存空間越大,此過程可能持續(xù)很長(zhǎng)一段時(shí)間(例如當(dāng)進(jìn)程占用60G+以上內(nèi)存時(shí),完整Core文件需要15分鐘才能完全寫到磁盤上),這期間產(chǎn)生的流量損失,不可估量。
凡事皆有兩面性,OS在出Core的同時(shí),雖然會(huì)終止掉當(dāng)前進(jìn)程,但是也會(huì)保留下第一手的現(xiàn)場(chǎng)數(shù)據(jù),OS仿佛是一架被按下快門的相機(jī),而照片就是產(chǎn)出的Core文件。里面含有當(dāng)進(jìn)程被終止時(shí)內(nèi)存、CPU寄存器等信息,可以供后續(xù)開發(fā)人員進(jìn)行調(diào)試。
關(guān)于Core產(chǎn)生的原因很多,比如過去一些Unix的版本不支持現(xiàn)代Linux上這種GDB直接附著到進(jìn)程上進(jìn)行調(diào)試的機(jī)制,需要先向進(jìn)程發(fā)送終止信號(hào),然后用工具閱讀core文件。
在Linux上,我們就可以使用kill向一個(gè)指定的進(jìn)程發(fā)送信號(hào)或者使用gcore命令來使其主動(dòng)出Core并退出。如果從淺層次的原因上來講,出Core意味著當(dāng)前進(jìn)程存在BUG,需要程序員修復(fù)。
從深層次的原因上講,是當(dāng)前進(jìn)程觸犯了某些OS層級(jí)的保護(hù)機(jī)制,逼迫OS向當(dāng)前進(jìn)程發(fā)送諸如SIGSEGV(即signal 11)之類的信號(hào), 例如訪問空指針或數(shù)組越界出Core,實(shí)際上是觸犯了OS的內(nèi)存管理,訪問了非當(dāng)前進(jìn)程的內(nèi)存空間,OS需要通過出Core來進(jìn)行警示,這就好像一個(gè)人身體內(nèi)存在病毒,免疫系統(tǒng)就會(huì)通過發(fā)熱來警示,并導(dǎo)致人體發(fā)燒是一個(gè)道理(有意思的是,并不是每次數(shù)組越界都會(huì)出Core,這和OS的內(nèi)存管理中虛擬頁(yè)面分配大小和邊界有關(guān),即使不出Core,也很有可能讀到臟數(shù)據(jù),引起后續(xù)程序行為紊亂,這是一種很難追查的BUG)。
說了這些,似乎感覺Core很強(qiáng)勢(shì),讓人感覺缺乏控制力,其實(shí)不然。
【假如再有一次機(jī)會(huì)的命題作文】相關(guān)文章:
假如再有一次機(jī)會(huì)作文02-07
假如再有一次機(jī)會(huì)作文12-16
假如再有一次機(jī)會(huì)作文(精選18篇)11-27
- 相關(guān)推薦