3

我正在用 C++ 编写一个 Win32 服务。我有一个调用 DebugBreak() 的自定义 Assert 宏(除其他外)。当我在 Vista 下运行我的服务时,服务在到达 DebugBreak() 调用(一个 int 3 汇编器操作码)时崩溃,显示 vista 崩溃对话框。错误代码是 80000003(硬编码断点)。

通常我希望我的服务在没有附加调试器时运行在 DebugBreak() 调用上而不做任何事情。为什么会崩溃?是否有可能更改设置以使其继续运行?

4

2 回答 2

6

它正在崩溃,因为它是一个断点异常。为了安全起见,您需要检查是否附加了调试器:

if(::IsDebuggerPresent())::DebugBreak();

或使用 try/except 并为过滤器中的断点异常返回 1(带有空处理程序的异常执行处理程序)。

于 2009-01-23T10:52:50.453 回答
2

通常我希望我的服务在没有附加调试器时运行在 DebugBreak() 调用上而不做任何事情。为什么会崩溃?

DebugBreak 函数的MSDN 帮助说:“如果进程没有被调试,该函数使用标准异常处理程序的搜索逻辑。在大多数情况下,这会导致调用进程由于未处理的断点异常而终止。”

是否有可能更改设置以使其继续运行?

您可以尝试添加结构化异常处理程序。

或者,在调用 DebugBreak 之前检查一些运行时标志。

于 2009-01-23T10:49:58.853 回答