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