为什么我的服务在Vista上的DebugBreak()崩溃?

时间:2009-01-23 10:32:03

标签: winapi windows-vista service crash breakpoints

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

通常情况下,我希望我的服务在DebugBreak()调用时运行,而不会在没有连接调试器的情况下执行任何操作。为什么会崩溃?是否有可能进行更改以使其继续运行?

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

  

通常情况下,我希望我的服务在DebugBreak()调用时运行,而不会在没有连接调试器的情况下执行任何操作。为什么会崩溃?

MSDN Help for the DebugBreak function表示,“如果进程未被调试,则该函数使用标准异常处理程序的搜索逻辑。在大多数情况下,这会导致调用进程因未处理的断点异常而终止。 “

  

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

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

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