2009-01-23 52 views
2

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

正常情况下,我期望在没有调试器连接的情况下,我的服务运行在DebugBreak()调用上,而不需要执行任何操作。它为什么会崩溃?是否有可能改变设置以便继续运行?

回答

5

它正在崩溃,因为它是一个断点例外。 为了安全起见,您需要检查是否连接了调试器:

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

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

2

正常情况下,我期待我的服务运行在DebugBreak()调用上,而不需要在没有调试器连接时执行任何操作。它为什么会崩溃?

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

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

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

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

+0

当然这两个答案都是正确的。感谢您的帮助,我不知道DebugBreak()会导致异常。 – vividos 2009-01-23 12:15:22