我正在用 C++ 编写一个 Win32 服务。我有一个调用 DebugBreak() 的自定义 Assert 宏(除其他外)。当我在 Vista 下运行我的服务时,服务在到达 DebugBreak() 调用(一个 int 3 汇编器操作码)时崩溃,显示 vista 崩溃对话框。错误代码是 80000003(硬编码断点)。
通常我希望我的服务在没有附加调试器时运行在 DebugBreak() 调用上而不做任何事情。为什么会崩溃?是否有可能更改设置以使其继续运行?
我正在用 C++ 编写一个 Win32 服务。我有一个调用 DebugBreak() 的自定义 Assert 宏(除其他外)。当我在 Vista 下运行我的服务时,服务在到达 DebugBreak() 调用(一个 int 3 汇编器操作码)时崩溃,显示 vista 崩溃对话框。错误代码是 80000003(硬编码断点)。
通常我希望我的服务在没有附加调试器时运行在 DebugBreak() 调用上而不做任何事情。为什么会崩溃?是否有可能更改设置以使其继续运行?
它正在崩溃,因为它是一个断点异常。为了安全起见,您需要检查是否附加了调试器:
if(::IsDebuggerPresent())::DebugBreak();
或使用 try/except 并为过滤器中的断点异常返回 1(带有空处理程序的异常执行处理程序)。
通常我希望我的服务在没有附加调试器时运行在 DebugBreak() 调用上而不做任何事情。为什么会崩溃?
DebugBreak 函数的MSDN 帮助说:“如果进程没有被调试,该函数使用标准异常处理程序的搜索逻辑。在大多数情况下,这会导致调用进程由于未处理的断点异常而终止。”
是否有可能更改设置以使其继续运行?
您可以尝试添加结构化异常处理程序。
或者,在调用 DebugBreak 之前检查一些运行时标志。