【问题标题】:Ways for an unmanaged Windows process to crash?非托管 Windows 进程崩溃的方法?
【发布时间】:2023-03-29 07:12:01
【问题描述】:

我试图了解非托管用户模式 ​​Windows 进程可能“崩溃”的方式(这实在是一个笼统的术语)。

目前我知道的方法如下:

  • 未处理的结构化异常
    • 默认 UnhandledExceptionFilter:Vista 之前的事后调试器; Vista+ 中的 WerFault
    • 自定义 UnhandledExceptionFilter:可以为所欲为,包括安静退出?
  • “硬”崩溃(不确定是否有相关的技术术语)
    • 例如在处理堆栈溢出时点击堆栈溢出保护页面:操作系统只是让进程消失得无影无踪?
  • “正常”退出:
    • 例如其中语言提供了自己的错误处理机制,使操作系统看起来像应用程序正常关闭一样致命崩溃。

这大致正确吗?用户模式 ​​Windows 进程是否有任何其他方式死亡?

【问题讨论】:

  • 我不确定您所说的“崩溃”是什么意思,但外力也可以杀死您的进程(即 TerminateProcess)。这与人们通常所说的“崩溃”不同,因为您的进程没有任何机会处理它。
  • @Luke 同意了。为了让您更好地理解我的意思,当我在 experimenting with Windows Error Reporting 时出现提示,发现即使 WER 被禁用,程序仍然可以通过 UnhandledExceptionFilter->NtRaiseHardError 崩溃并显示不同的错误消息,显示类似这个:i.imgur.com/fBsTI.png

标签: windows crash structured-exception


【解决方案1】:
  • 未处理的异常 - 这通常是人们所说的“崩溃”
  • 堆栈损坏的异常 - 如果堆栈损坏并且无法遍历异常链,则进程将被静默终止。
  • 显式终止
    • 从另一个进程(例如 TaskManager、kill.exe)调用 TerminateProcess
    • C/C++ 运行时致命错误、/GS 堆栈 cookie 损坏等
  • 附加调试器并退出调试器而不分离
  • 如果您杀死相应的 conhost.exe 进程,控制台应用程序将终止

【讨论】:

  • 在 x64 上运行时 WOW32 怎么样?这能杀吗? :)
猜你喜欢
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多