Most architectures use some kind of fatal breakpoint instructions. Some of them manually trigger an illegal instruction. It varies whether you get SIGILL or SIGSEGV. It doesn't necessarily work due to signal handling or debuggers. If compiler has __builtin_trap it uses that.