棧追蹤

在計算機科學領域,棧追蹤(英語:stack trace)是對程式運行過程中的某個時間點上活躍棧幀信息的描述。棧追蹤也稱堆疊回溯。

簡介

程式設計師通常在互動式調試或者事發後調試中使用棧追蹤。最終用戶則可能在錯誤信息中看到棧追蹤,並且可以選擇將其反饋給程式設計師。

棧跟蹤允許跟蹤被調用的嵌套函式序列- 直到生成堆疊跟蹤的點。。同級調用不會出現在堆疊跟蹤中。

語言支持

包括Java和C#在內的很多程式語言都內置相關支持,可以通過系統調用獲取當前的棧追蹤。C++沒有內置此類功能,不過 C++ 用戶可以通過第三方庫獲取棧追蹤。JavaScript的異常中有stack屬性,包含了拋出處的棧信息。

異常處理

異常處理,是程式語言或計算機硬體里的一種機制,用於處理軟體或信息系統中出現的異常狀況(即超出程式正常執行流程的某些特殊條件)。

各種程式語言在處理異常方面具有非常顯著的不同點(錯誤檢測與異常處理區別在於:錯誤檢測是在正常的程式流中,處理不可預見問題的代碼,例如一個調用操作未能成功結束)。某些程式語言有這樣的函式:當輸入存在非法數據時不能被安全地調用,或者返回值不能與異常進行有效的區別。例如,C語言中的atoi函式(ASCII串到整數的轉換)在輸入非法時可以返回0。在這種情況下編程者需要另外進行錯誤檢測(可能通過某些輔助全局變數如C的errno),或進行輸入檢驗(如通過正則表達式),或者共同使用這兩種方法。

通過異常處理,我們可以對用戶在程式中的非法輸入進行控制和提示,以防程式崩潰。

從進程的視角,硬體中斷相當於可恢復異常,雖然中斷一般與程式流本身無關。

從子程式編程者的視角,異常是很有用的一種機制,用於通知外界該子程式不能正常執行。如輸入的數據無效(例如除數是0),或所需資源不可用(例如檔案丟失)。如果系統沒有異常機制,則編程者需要用返回值來標示發生了哪些錯誤。

尾調用

在計算機學裡, 尾調用是指一個函數裡的最後一個動作是返回一個函式的調用結果的情形,即最後一步新調用的返回值直接被當前函式的返回結果。此時,該尾部調用位置被稱為 尾位置。尾調用中有一種重要而特殊的情形叫做 尾遞歸。經過適當處理,尾遞歸形式的函式的運行效率可以被極大地最佳化。尾調用原則上都可以通過簡化函式調用棧的結構而獲得性能最佳化(稱為“尾調用消除”),但是最佳化尾調用是否方便可行取決於運行環境對此類最佳化的支持程度如何。

堆疊溢出

堆疊溢出(英語:stack overflow)在計算機科學中是指使用過多的存儲器時導致調用堆疊產生的溢出。堆疊溢出的產生是由於過多的函式調用,導致調用堆疊無法容納這些調用的返回地址,一般在遞歸中產生。堆疊溢出很可能由無限遞歸(Infinite recursion)產生,但也可能僅僅是過多的堆疊層級。

堆疊溢出在核心設計中尤其危險,因此很多入門核心設計教程建議用戶不要嘗試使用遞歸程式;而是基於安全和性能考量,改用循環處理問題。

在POSIX兼容平台上,堆疊溢出通常會造成作業系統產生SIGSEGV信號。

相關詞條

熱門詞條

聯絡我們