2008-12-10 29 views
1

有沒有辦法在崩潰轉儲中查看每個堆棧幀中的寄存器內容? 當發生異常時,寄存器窗口似乎包含寄存器,但能夠在每個堆棧幀中看到它們的內容會很有用。查看崩潰轉儲中的寄存器

回答

2

根據調用約定,您可以獲取一些保存在堆棧上的寄存器。例如,在cdecl calling convention中,除了EAX,ECX和EDX之外的所有寄存器都需要由主叫方或被叫方保存。這三個寄存器是可破解的,所以你通常無法從調用堆棧中的較高位置獲取它們的值。如果函數沒有使用必須保存的寄存器,那麼它不會保存它,但由於它不使用它,該寄存器在下一個更高的堆棧幀中具有相同的值。

1

在做了一些研究並思考了一下之後,我意識到這可能是不可能的。崩潰minidump保存進程內存的某些區域(取決於傳遞給MiniDumpWriteDump()函數的標誌)以及足夠的狀態信息來重新創建崩潰發生在調試器中的環境。它在每個指令處甚至每個堆棧幀都沒有處理器狀態,只知道發生異常時的處理器狀態。

-1

我不認爲你可以在調試時得到它。您可以從寄存器獲得的唯一值是當前指令的值。

0

在經過優化的版本中,向下堆疊的某些信息可能會被扔掉,但是,您可以要求調試器嘗試向您顯示給定堆棧幀的信息。首先執行「kn」以查看具有幀編號的堆棧,然後嘗試「.frame /c [frame]」或「.frame /r [frame]」。

查看幫助(「.hh」)瞭解更多信息。