Run debug-bench.exe with no arguments and this table is printed. This is real output, from a 64-bit Release build run with no debugger attached.
api clean api.isdebuggerpresent IsDebuggerPresent() = FALSE clean api.remotedebugger CheckRemoteDebuggerPresent() = FALSE clean api.debugport ProcessDebugPort = 0x0 clean api.debugflags ProcessDebugFlags = 0x1 clean api.debugobject ProcessDebugObjectHandle = 0x0 peb clean peb.beingdebugged PEB.BeingDebugged = 0 clean peb.ntglobalflag NtGlobalFlag = 0x00000000 clean peb.heapflags Heap Flags = 0x00000002 clean peb.heapforceflags Heap ForceFlags = 0x00000000 exception clean exception.int3 our __except caught the breakpoint clean exception.int3long our __except caught the long breakpoint clean exception.singlestep our __except caught the single-step clean exception.guardpage our __except caught the guard-page fault clean exception.closehandle CloseHandle(bad) returned quietly clean exception.outputdebugstring last error preserved timing clean timing.rdtsc RDTSC delta = 230 cycles clean timing.rdtsccpuid RDTSC-around-CPUID delta = 1052 cycles clean timing.rdtscp RDTSCP delta = 122 cycles clean timing.qpc QPC delta = 1 ticks clean timing.gettickcount GetTickCount64 delta = 0 ms context clean context.hardwarebreakpoints Dr0=0x0 Dr1=0x0 Dr2=0x0 Dr3=0x0 Dr7=0x0 clean context.threadhide ThreadHideFromDebugger = clear environment clean environment.parentprocess parent = bash.exe clean environment.debuggerwindows no debugger windows clean environment.debuggerprocesses no debugger processes clean environment.debuggerdevices no debugger devices clean environment.moduleallowlist all 12 modules under allowed paths DETECTED environment.hypervisorbit CPUID.1:ECX[31] = 1 DETECTED environment.hypervisorvendor hypervisor vendor = Microsoft Hv clean environment.kerneldebugger KdDebuggerEnabled=0 KdDebuggerNotPresent=1 2 of 30 checks fired.
The two environment checks fire on a physical PC because Windows runs its virtualization-based security on Hyper-V, which sets the hypervisor bit. That is not a debugger. It is the false positive their explanations describe.
These are real results with plain x64dbg 2026.05.27, no hiding plugin, on
Windows 10 19045. The test used x64dbg’s headless.exe,
so it could be scripted and the output captured. “Yes” means
the check fired.
| Check | Attached while running | Attached before the first instruction | After detach |
|---|---|---|---|
| api.isdebuggerpresent | Yes | Yes | No |
| api.remotedebugger | Yes | Yes | No |
| api.debugport | Yes | Yes | No |
| api.debugflags | Yes | Yes | Yes |
| api.debugobject | Yes | Yes | No |
| peb.beingdebugged | Yes | Yes | No |
| peb.ntglobalflag | No | Yes | No |
| peb.heapflags | No | Yes | No |
| peb.heapforceflags | No | Yes | No |
| exception.closehandle | Yes | Yes | No |
The heap and global-flag checks fire only when the debugger is there as
the process starts. Windows sets those flags while it loads the process.
api.debugflags stays set after the debugger detaches, so it
also shows a debugger that has come and gone.
The int3, single-step and OutputDebugString checks did not
fire. x64dbg stopped on each exception, and when it resumed, the
program’s own handler still ran. The debugger-window check did not
fire because the headless build has no window. The x64dbg GUI would trip
it. The two hypervisor checks fired in every run, as above.
--only <class> runs one class at a time.ProcessDebugFlags = 0x1. Each check also carries an explanation of what it detects, its false positives, and how it is commonly neutralized. The explanations are in the --json output and in src/core/Checks.cpp.--loop [ms] re-runs the checks on an interval. Attach a debugger while it runs and watch which checks start to fire. Turn on a debugger-hiding plugin and watch them go clean again.debug-bench-v1.0.0.zip, with release\x64\debug-bench.exe and release\x32\debug-bench.exeint 3, single-step and guard-page traps--loop to watch checks flip--only to run one classIntended use. debug-bench is for studying software you own or are authorized to analyze, and for testing your own debugger and anti-debug tooling. It is a target you run yourself. It only reads its own process and changes nothing on the system. Using a debugger against online or competitive games will very likely trip anti-cheat software and get the account banned. This is a research tool.
The binaries are unsigned. Antivirus software may flag a program that reads its own PEB and raises breakpoints. Build it from source if you would rather not take a binary on trust.
No Administrator needed. Nothing in debug-bench needs Administrator. Running it as a normal user is the intended case.
Some checks fire with no debugger. The hypervisor checks fire in a VM, and on a PC running virtualization-based security, WSL 2 or Docker. The timing checks fire on stepping or a slow virtual clock. Each check’s explanation says when it gives a false positive.