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