終于把《讓程序在崩潰時(shí)體面的退出》這個(gè)系列的6篇文章全部發(fā)表出來(lái)了。
這6篇文章分別是:
《讓程序在崩潰時(shí)體面的退出之Unhandled Exception》
《讓程序在崩潰時(shí)體面的退出之CallStack》
《讓程序在崩潰時(shí)體面的退出之Dump文件》
《讓程序在崩潰時(shí)體面的退出之SEH》
《讓程序在崩潰時(shí)體面的退出之SEH+Dump文件》
《讓程序在崩潰時(shí)體面的退出之終極解決方案(SEH+Dump+Unhandled Exception Filter)》
WINCE-如何通過(guò)map文件定位異常地址
對(duì)這些東西的研究起始于項(xiàng)目中一個(gè)Prototype的開(kāi)發(fā)。這個(gè)Prototype就是給我們的產(chǎn)品加上Log信息。既然是Log信息,那么在應(yīng)用程序崩潰的時(shí)候也要記錄發(fā)生了什么而導(dǎo)致程序崩潰,而且這個(gè)信息對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)是非常重要的。為此,在網(wǎng)上搜索了大量的資料來(lái)看,英文的中文的,再加上MSDN和那本磚頭書(shū)《Windows via C/C++》,總算是把Windows下軟件開(kāi)發(fā)中對(duì)致命異常的處理給搞清楚了。按照我以前的習(xí)慣,把學(xué)到的新知識(shí)從新梳理總結(jié)了一下,寫(xiě)成了這6篇系列文章。
現(xiàn)在文章發(fā)表完了,這篇文章只是一個(gè)總結(jié),而不是終結(jié)。因?yàn)樵趯W(xué)習(xí)和寫(xiě)文章的過(guò)程中,還有一些問(wèn)題沒(méi)有徹底搞明白,比如SEH中的EXCEPTION_CONTINUE_EXECUTION和SEH與C++中的EH的混合使用。
SEH中的EXCEPTION_CONTINUE_EXECUTION
不管是MSDN還是《Windows via C/C++》,對(duì)SEH中的EXCEPTION_CONTINUE_EXECUTION解釋都一樣:Exception is dismissed. Continue execution at the point where the exception occurred.。也就是說(shuō)返回到出現(xiàn)異常的地方重新執(zhí)行。而且《Windows via C/C++》還專(zhuān)門(mén)寫(xiě)了一個(gè)例子來(lái)說(shuō)明。可是我按照書(shū)上的例子寫(xiě)出同樣的代碼,執(zhí)行的結(jié)果卻跟書(shū)上不一樣:首先,代碼執(zhí)行結(jié)果并不是期望的那樣;其次,出現(xiàn)異常的那行代碼后面的代碼并沒(méi)有執(zhí)行。在網(wǎng)上搜索了一通,得到的答案是:返回到出現(xiàn)異常的地方重新執(zhí)行是返回到匯編指令的那個(gè)地方,而不是C++代碼的那一行,如果這個(gè)指令用到了寄存器內(nèi)的內(nèi)容,那么由于寄存器內(nèi)容沒(méi)有被修改,所以執(zhí)行結(jié)果依然是錯(cuò)的。但是這只是解釋了第一問(wèn)題,對(duì)于第二個(gè)問(wèn)題依然沒(méi)有答案。如果有時(shí)間的話(huà),我會(huì)繼續(xù)對(duì)這個(gè)問(wèn)題進(jìn)行研究。
SEH與C++中的EH的混合使用
SEH是結(jié)構(gòu)化的,不支持面向?qū)ο蟆6鳦++中的try/catch又只能捕捉到預(yù)定義的異常。各有優(yōu)缺點(diǎn),要想捕捉到所有異常,就要2個(gè)都用。那么代碼的可讀性和可維護(hù)性就會(huì)很差。不過(guò),有網(wǎng)友看到我的文章后告訴我了一篇文章的地址,那篇文章就是講怎么樣將SEH的異常轉(zhuǎn)換成C++中的異常。這是一個(gè)非常好的方法。有空的話(huà),我也會(huì)對(duì)這方面進(jìn)行一下研究。
|