2017-07-24 54 views
0

我正在爲我的Windows桌面應用程序的崩潰處理系統工作,並不確定捕獲一些異常的最佳方法。這裏有3個簡單的函數崩潰:如何在Windows中捕獲RSP和RIP損壞異常?

crash_av proc 
    xor rax, rax 
    mov qword ptr [rax], 0 
    ret 
crash_av endp 

trash_rip proc 
    push 0 
    push 0 
    ret 
trash_rip endp 

trash_rsp proc 
    xor rsp, rsp 
    ret 
trash_rsp endp 

使用SetUnhandledExceptionFilter,我只能夠趕上crash_av

使用AddVectoredExceptionFilter,我只能趕上crash_avtrash_rip

但我不知道有什麼辦法可以趕上trash_rsp。可能嗎?是否有其他碰撞情況我應該尋找?有沒有一種規範的方法可靠地捕獲這些崩潰的全部

+0

沒有辦法趕上*「崩潰」*。可以攔截未處理的SEH異常,但是您的代碼可能會或可能不會引發異常。 – IInspectable

回答

0

任何異常處理程序在線程的上下文中執行,發生異常。如果trash_rsp - 請問 - 當異常開始處理時,哪一個必須是rsp(堆棧指針)?當你損壞rsp(超出堆棧空間) - 遊戲結束了你的過程。任何內部處理程序都無法從此恢復。

如果SetUnhandledExceptionFilter存在一個點 - UnhandledExceptionFilter僅當調試器未附加到您的過程時調用。所以如果調試器連接 - UnhandledExceptionFilter不叫。如果未連接調試器,則必須調用crash_avtrash_rip這兩個不良測試UnhandledExceptionFilter。否則不能同時調用。

AddVectoredExceptionHandler調用任何異常(rsp超出堆棧空間除外)獨立於附加的調試器或no。當然,如果調試器不能處理第一次機會和另一個異常AddVectoredExceptionHandler不處理異常之前您的