今天終於大致了解了,seh中關於eh_unwinding的作用以及,vc++編譯器中異常處理的一點點小東西,老規矩先帖完整測試**:
en_winding winding的中文有一種譯法叫「從纏繞中解開」,我覺得很形象,用乙個例子說明en_winding的作用,假設,能正確處理本例子的異常為erx
er鍊錶應該是這樣的: er1->er2->er3->erx->er4->er5
那麼當異常發生的時候,遍歷er鏈,最後找到erx,這個時候windows會再次遍歷該er鏈,這次的遍歷有2個作用(就目前我所知道的部分哈)
1、釋放某些因為異常導致來不及清理的資源
2、徹底斷開er鏈中正確處理異常的er前的其他節點
也就是說,異常處理完畢後 er鏈應該是這個樣子:erx->er4->er5
雖然eh_windingd的作用書上都有介紹,但還是不及自己跟蹤後的那種程度清晰
接下來就是乙個比較有意思的發現了,就是c++中 _try 和 _except的一些小秘密,雖然封裝的很嚴實,但還是有些馬腳露出來的!
首先我們現在主函式後的那個(上下個跟蹤斷點,考慮在這下斷,是因為想先看看程式最原始(也許並不是最,但對我們的試驗不影響)的時候,er鏈的情況:
er1->er2->end
發現了乙個現象,程式剛run時,er鏈只有2個節點,我原以為是偶然,但重起機器後發現並非偶然,而且位址固定,這個不重要.
f10單步,來到了_try處,繼續步過,這個時候我們在memory中查詢fs:[0]值,這個值就是第乙個節點也就是表頭的位址,不在是原來的er1的位址了,而是換成了另外乙個位址,但這個位址確確實實是一直存在,跟蹤後會發現這點,最初,我是這樣大膽猜想的,_try在一開始就偷偷的在原來的er鏈上掛接了乙個自己的er結構,也就是說_try執行後,er鏈變成這樣了:er3->er1->er2->end
本來如果不是後來發現點東西,我差點就這樣蓋棺定論了,轉折點在這:
_except( exception_execute_handler) 在此句下斷,注意觀察fs:[0]會發現,剛才才出現新頭領er3之前又出現了個主,我們暫且叫er4,於是er鏈變成這樣了:
er4->er3->er1->er2->end
但這主(er4)很短命,在步過這句後,就消失了,er鏈又變為:
er3->er1->er2->end這個發現很奇怪,我想應該是編譯器處理級的內容,我暫時還不明白。
上面的** 包含了新er連建立的2個方法,乙個是在表頭建立,乙個是在第一節點和第2節點之間建立,可以引申到在鏈中任意位置建立
不過通過上面的簡單分析知道了_try總喜歡把他們的er結構掛在表頭,彷彿自己是老大,呵呵
Delphi學習手記
本人一直使用c buider,並開發了乙個 商關係管理 的三層應用系統.現公司要求使用delphi,沒辦法只有重新學習pascal語言.便記錄學習的過程,那就叫delphi學習手記吧.1 好象inherit form不行,如果想覆蓋上邊的方法,重寫事件或函式,竟然報錯,不懂先,是不是inherit不...
python學習手記
1.list由小到大排序用list.sort 由大到小排序用list.sort reverse true 2.list逆序用list.reverse 3.list 0 代表list中的第乙個元素,中括號一般用於表示元素位置,表示元素 4.dict中沒有排序的說法,keys用於表示位置,應用時用 6....
github學習手記
1.安裝配置 安裝 配置 git config global user.name your name git config global user.email email example.com ssh keygen t rsa c your email youremail.com 成功的話會在 下...