16

有什么方法可以检测到调试器是否在内存中运行?

这是表单加载伪代码。

if debugger.IsRunning then
Application.exit
end if

编辑:原标题是“Detecting an in memory debugger”

4

2 回答 2

33

尝试以下

if ( System.Diagnostics.Debugger.IsAttached ) {
  ...
}
于 2009-08-25T19:36:11.350 回答
5

在使用它关闭在调试器中运行的应用程序之前要记住两件事:

  1. 我使用调试器从商业 .NET 应用程序中提取崩溃跟踪,并将其发送到公司,随后修复了它,感谢您使它变得简单和
  2. 该检查可能会被轻易击败。

现在,为了更有用,这里是如何使用此检测来防止调试器中的func eval更改您的程序状态,如果您出于性能原因缓存了一个延迟评估的属性。

private object _calculatedProperty;

public object SomeCalculatedProperty
{
    get
    {
        if (_calculatedProperty == null)
        {
            object property = /*calculate property*/;
            if (System.Diagnostics.Debugger.IsAttached)
                return property;

            _calculatedProperty = property;
        }

        return _calculatedProperty;
    }
}

我有时也使用此变体来确保我的调试器逐步执行不会跳过评估:

private object _calculatedProperty;

public object SomeCalculatedProperty
{
    get
    {
        bool debuggerAttached = System.Diagnostics.Debugger.IsAttached;

        if (_calculatedProperty == null || debuggerAttached)
        {
            object property = /*calculate property*/;
            if (debuggerAttached)
                return property;

            _calculatedProperty = property;
        }

        return _calculatedProperty;
    }
}
于 2009-08-25T19:49:36.287 回答