2009-08-25 3 views
13

Есть ли способ обнаружить, что отладчик работает в памяти?Изменение потока программы при работе под отладчиком

и здесь находится псевдокод Form Load Load.

if debugger.IsRunning then 
Application.exit 
end if 

Edit: Оригинальное название было «обнаружения в отладчике памяти»

+1

Большинство отладчиков может быть присоединен к процессу во время выполнения. В этом случае проверка на отладчик на statrup не поможет. –

ответ

29

Попробуйте следующие

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

Две вещи, чтобы иметь в виду, прежде чем использовать это, чтобы закрыть работу приложения в отладчике:

  1. Я использовал отладчик, чтобы вытащить ac опрометчивая трассировка из коммерческого приложения .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; 
    } 
} 
+0

Это классная идея, но она меняет поток вашей программы при работе под отладчиком, поэтому вы больше не отлаживаете код, который вы используете в выпуске. ИМХО, в большинстве случаев было бы лучше предоставить не кэшированный вариант свойства (внутри #if DEBUG, поэтому он не встроен в релизы), который вы можете использовать в отладчике для изучения значения, оставив «реальное» свойство, работающее с так же как в сборках debug и release. –

+0

@ Джейсон: да и нет. В этом случае все методы, вызываемые для оценки свойства, являются чистыми (без побочных эффектов независимо от того, когда вызывается), поэтому я фактически гарантировал, что это относится и к свойствам, а также к перспективе приложения. –

Смежные вопросы