2010-02-10 74 views
0

我有一個在Windows Server 2003 SP2下運行的進程。當我想檢查其中一個線程的堆棧跟蹤時,它總是限制爲9個條目。這些條目解決正確(我有PDBs),但名單只是在中間切割。Process Explorer中的有限堆棧跟蹤

您是否知道Process Explorer中的任何限制?

回答

1

我假設你認爲這個線程的完整堆棧跟蹤應該有超過9個條目。你不提32位操作系統或64位操作系統,但我會假設32位操作系統,然後覆蓋64位作爲事後的想法。

有時,在32位系統上收集堆棧跟蹤時,您無法爲堆棧跟蹤收集任何項目,或者即使您知道調用堆棧更深,您也只能收集有限數量的堆棧幀信息。造成這種情況的原因有:

  • 不同的調用約定會將數據放在堆棧的不同位置,導致難以走棧。我可以想到4種定義,3種常用,另外一種是奇特的:cdecl,fastcall,stdcall,naked。

  • 對於發佈版本,代碼優化器可以使用被稱爲幀指針省略(FPO)的技術來取消幀指針。如果沒有FPO(有時甚至是PDB文件中的FPO數據),則無法成功地執行調用堆棧。鉤子 - 任何助手DLL,防病毒,調試鉤子,檢測代碼,惡意軟件等等,都可能在某個點上弄亂了調用堆棧,因爲他們已經在調用堆棧中插入了自己的存根代碼,並且該小塊可能不會步行者可以步行。

  • 字節碼虛擬機。根據虛擬機的寫入方式,虛擬機可能會在調用堆棧上放置蹦牀來幫助執行。這些將使堆疊難以成功行走。

由於各種呼叫在32位的Windows(微軟和其他廠商)約定的,很難制定出當你從一個框移動到另一個會發生什麼。

對於64位系統,有一個指定的調用約定。這使生活變得更容易。也就是說,你仍然存在幫助程序DLL和鉤子在堆棧中執行自己的事情的問題,並且在堆棧中可能仍然會導致問題。

我懷疑Process Explorer中存在限制。我認爲這個問題只是因爲我上面列出的原因之一,爲該線程漫遊是困難的。