In MSVC, DebugBreak() or __debugbreak cause a debugger to break. On x86 it is equivalent to writing "_asm int 3", on x64 it is something different. When compiling with gcc (or any other standard compiler) I want to do a break into debugger, too. Is there a platform independent function or intrinsic? I saw the XCode question about that, but it doesn't seem portable enough.
Sidenote: I mainly want to implement ASSERT with that, and I understand I can use assert() for that, but I also want to write DEBUG_BREAK or something into the code.
I just added a module to portable-snippets (a collection of public domain snippets of portable code) to do this. It's not 100% portable, but it should be pretty robust:
__builtin_debugtrap
for some versions of clang (identified with__has_builtin(__builtin_debugtrap)
)__debugbreak
__breakpoint(42)
int $03
.inst 0xde01
.inst 0xd4200000
.inst 0xe7f001f0
bpt
__builtin_trap
signal.h
anddefined(SIGTRAP)
(i.e., POSIX),raise(SIGTRAP)
raise(SIGABRT)
In the future the module in portable-snippets may expand to include other logic and I'll probably forget to update this answer, so you should look there for updates. It's public domain (CC0), so feel free to steal the code.
If you are trying to debug a crash-related condition, good old fashioned abort() will give you a call stack on most platforms. Downside is that you can't continue from the current PC, which you probably don't want to do anyway.
http://www.cplusplus.com/reference/cstdlib/abort/
This looks like an appropriate compat library https://github.com/scottt/debugbreak
GCC has a builtin function named
__builtin_trap
which you can see here, however it is assumed that code execution halts once this is reached.you should ensure that the
__builtin_trap()
call is conditional, otherwise no code will be emitted after it.this post fueled by all of 5 minutes of testing, YMMV.
A method that is portable to most POSIX systems is:
Instead of using 'normal' debug breaks, why not use one of the following, like a divide by zero:
or dereference a NULL pointer:
At least this is portable accross many platforms/architectures.
In many debuggers you can specify what action you want to perform on what exceptions so you can act accordingly when one of the above is hit (like pause execution, ala an "int 3" instruction) and an exception is generated.