文章編號: 100775 - 上次校閱: 2005年5月3日 - 版次: 3.1

堆疊檢查 Windows NT 為基礎的應用程式的描述

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
全部展開 | 全部摺疊

結論

堆疊檢查 Windows NT 應用程式中不同於在 MS-DOS 應用程式中檢查的堆疊。

其他相關資訊

MS-DOS 應用程式中只被偵測軟體堆疊溢位。預設情況下,編譯器會在每個函式初構的程式碼插入 __chkstk() 函式呼叫。__chkstk() 函式會比較的堆疊空間函式需要使用可用的堆疊空間量。函式問題溢位錯誤如果目前的堆疊指標,並要求堆疊配置超過最大的堆疊大小 EXE 標頭中指定。

在 Microsoft Windows NT 作業系統系統中堆疊溢位會偵測到硬體與軟體一起,工作使用頁面保護機制。每個新的 Windows NT 處理序有一個最大保留的堆疊大小和初始的認可的堆疊配置。已交付的記憶體實際配置給處理程序,而且由分頁檔支援 ; 它會相當"昂貴的"的資源。保留的記憶體是未對應到真正的記憶體位址空間,它是相當"廉價的"的資源。

隨著增加堆疊,將從堆疊記憶體一部分認可到保留或未認可的記憶體。在這種情況會發生分頁錯誤,並操作系統認可另一個記憶體分頁至堆疊。如果當堆疊已經增長到其最大的指定大小,則會發生分頁錯誤,系統會報告堆疊溢位例外狀況。

這個自動成長] 方法會使用守衛頁面一個連續與認可的記憶體部份的保留、 未認可,記憶體頁。當應用程式接觸守衛頁面時,作業系統認可頁面和下一個未認可的頁面會變成新的守衛頁面。自動堆疊成長的運作方式僅供守衛頁面及堆疊記憶體必須以 4 K 或一頁的增量成長。如果接觸守衛頁面之前,應用程式接觸到另一個網頁保留,但未認可的堆疊記憶體,一般分頁錯誤例外狀況發生,可能會造成無法預期的行為。

如果函式在它的初構程式碼中包含下列陳述式,可能會發生這個問題:
   PUSH   EBP
   MOV    EBP,ESP
   SUB    ESP,10000
   PUSH   ESI
				
這段程式碼在推入 EBP 及發送 ESI 不會發生在相同或相鄰 4K 堆疊頁中。如果堆疊必須成長到容納 10,000 位元組本機配置,此程式錯誤。

若要避免錯誤,編譯器會呼叫 __chkstk() 函式本機配置超過 4K 每次。Windows NT __chkstk() 函式並不會明確地檢查堆疊溢位的 MS-DOS 版本一樣。它只需要接觸到的記憶體位址從目前的堆疊指標所在位置每 4 K 到要求的配置。這觸發守衛頁面,以適當的順序,並視需要堆疊到認可額外的記憶體。

因此,當編譯器命令行包括 /Ge 選項參數初構程式碼一定會呼叫 __chkstk() 函式應用程式不執行如它可能會因為作業系統支援自動的機制,來執行堆疊溢位偵測有效率。

/ Gs 編譯器選項參數不會停用所有 __chkstk() 呼叫。而是,它會停用 __chkstk() 那些需要小於 4K 區域儲存區的函式的呼叫。/ Gs 選項是編譯器的預設行為。

/ Gs 選項可接受的選擇性參數的臨界值。如果函式的本機堆疊配置超過指定的閾值,編譯器插入 __chkstk() 呼叫函式初構中。在 Windows NT 中正確地執行為使用者模式應用程式,預設閾值 4096 是必要的。若要隱藏所有 __chkstk() 呼叫,指定手動高臨界值例如 / Gs999999/ Gs0 選項具有相同的功能為 /Ge 選項,並指示編譯器在每個函數中呼叫 __chkstk()。它可能是最好程式碼執行的環境中,堆疊是完全認可或堆疊成長機制否則無法使用時,如果變更預設值。

如需詳細資訊請 參考/Gs 編譯選項和 check_stack 前置處理器 Pragma [Visual C++ 線上叢書 》 中。

這篇文章中的資訊適用於:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
關鍵字:?
kbmt kbhowto kbcompiler kbinfo KB100775 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:100775? (http://support.microsoft.com/kb/100775/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。