Подтвердить что ты не робот

Есть ли эквивалент С# для IsDebuggerPresent()?

Я нашел этот фрагмент кода, но он не возвращает true, когда я отлаживаю:

[DllImport("kernel32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
internal static extern bool IsDebuggerPresent();
4b9b3361

Ответ 1

Да:

System.Diagnostics.Debugger.IsAttached

Ответ 2

Вы отметили свой вопрос как C#, поэтому я предполагаю, когда говорю "но он не возвращает true, когда я отлаживаю", вы фактически говорите об управляемой отладке.

Функция IsDebuggerPresent() проверяет наличие собственного отладчика. В вашем случае вы должны использовать System.Diagnostics.Debugger.IsAttached, чтобы проверить, присутствует ли (управляемый) отладчик.

Также см. этот пост в блоге для получения дополнительной информации об API-интерфейсах отладчика.

Ответ 3

Элемент .NET Framework, который напоминает IsDebuggerPresent(), наиболее очевидно, Debugger.IsAttached, но их внутренняя работа совсем другая, так же как Debugger.Log работает совсем не так, как просто OutputDebugString.

  • Debugger.IsAttached запрашивает CLR для наличия прикрепленного управляемый отладчик, и даже не потрудился проверить наличие родной отладчик.
  • IsDebuggerPresent() запрашивает ядро ​​наличие встроенного отладчика и не знает об управляемых отладчиках.

Как и в Visual Studio 2013, управляемый отладчик построен поверх встроенного отладчика, поэтому оба IsDebuggerPresent() и Debugger.IsAttached должны возвращать true при отладке управляемого приложения в VS. Но если вы подключили Visual Studio к управляемому приложению и явно переопределили тип кода на native, IsDebuggerPresent() вернет значение true, а Debugger.IsAttached все равно вернет false.

В конце концов, все сводится к тому, чего вы пытаетесь достичь.