.net 在调试器下运行时更改程序流

.net 在调试器下运行时更改程序流,.net,debugging,in-memory,cracking,.net,Debugging,In Memory,Cracking,有没有办法检测到调试器正在内存中运行 下面是表单加载伪代码 if debugger.IsRunning then Application.exit end if 编辑:原始标题是“检测内存中的调试器”请尝试以下操作 if ( System.Diagnostics.Debugger.IsAttached ) { ... } 使用此选项关闭在调试器中运行的应用程序之前,需要记住两件事: 我使用调试器从一个商业.NET应用程序中提取了一个崩溃跟踪,并将其发送给该公司,随后在该公司对其进行了修复

有没有办法检测到调试器正在内存中运行

下面是表单加载伪代码

if debugger.IsRunning then
Application.exit
end if
编辑:原始标题是“检测内存中的调试器”

请尝试以下操作

if ( System.Diagnostics.Debugger.IsAttached ) {
  ...
}

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

  • 我使用调试器从一个商业.NET应用程序中提取了一个崩溃跟踪,并将其发送给该公司,随后在该公司对其进行了修复,并感谢您使其变得简单和可靠
  • 这项检查可能会被琐碎地击败
  • 现在,为了发挥更大的作用,下面介绍了如何使用此检测来防止调试器中的缓存由于性能原因而延迟计算属性时更改程序状态

    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;
        }
    }
    

    大多数调试器可以在运行时附加到进程。在这种情况下,在statrup上检查调试器不会有多大帮助。这是一个很酷的想法-但是当在调试器下运行时,它会改变程序的流程,因此您不再调试在发行版中使用的代码。IMHO在大多数情况下,最好提供一个非缓存的属性变体(在#if DEBUG中,因此它不是内置在发行版中),您可以在调试器中使用它来检查值,让“real”属性在调试和发行版中以相同的方式工作。@Jason:是和否。在这种情况下,所有调用以计算属性的方法都是纯方法(无论何时调用,都没有副作用),因此我实际上是在确保从应用程序的角度来看属性也是纯方法。如果要创建仅在visual studio的调试模式下工作的库,您认为此方法有效吗?我想创建一个库,该库可以从VisualStudio免费测试,但不能包含在基于发布模式构建的应用程序中