当前位置:  开发笔记 > 编程语言 > 正文

是否有一个可移植的等效于DebugBreak()/ __ debugbreak?

如何解决《是否有一个可移植的等效于DebugBreak()/__debugbreak?》经验,为你挑选了5个好方法。

在MSVC中,DebugBreak()或__debugbreak导致调试器中断.在x86上它相当于写"_asm int 3",在x64上它是不同的东西.在使用gcc(或任何其他标准编译器)进行编译时,我也想进入调试器.是否存在平台无关功能或内在功能?我看到了XCode的问题,但它似乎不够便携.

旁注:我主要想用它来实现ASSERT,我知道我可以使用assert(),但我也想在代码中编写DEBUG_BREAK或其他东西.



1> caf..:

可移植到大多数POSIX系统的方法是:

raise(SIGTRAP);


`raise(SIGTRAP)`在gcc/Linux上对我很有用.`__builtin_trap()`导致`SIGILL`信号被引发.
@thomthom:你有#include `?

2> Jorge Ferrei..:

如何基于#ifdef定义一个基于当前架构或平台扩展到不同构造的条件宏.

就像是:

#ifdef _MSC_VER
#define DEBUG_BREAK __debugbreak()
#else
...
#endif

这将由预处理器根据编译代码的平台扩展正确的调试器中断指令.这样您就可以DEBUG_BREAK在代码中使用.



3> Hasturkun..:

GCC有一个内置函数__builtin_trap,你可以在这里看到,但是假设代码执行一旦达到就停止了.

应该确保__builtin_trap()调用是有条件的,否则之后就不会发出代码.

这篇文章由YMMV进行了5分钟的测试.



4> nemequ..:

我只是向可移植代码段(可移植代码的公共领域代码段的集合)添加了一个模块来执行此操作。它不是100%可移植的,但是应该非常健壮:

__builtin_debugtrap对于某些版本的clang(以标识__has_builtin(__builtin_debugtrap)

在MSVC和Intel C / C ++编译器上: __debugbreak

对于ARM C / C ++编译器: __breakpoint(42)

对于x86 / x86_64,组装: int $03

For ARM Thumb, assembly: .inst 0xde01

For ARM AArch64, assembly: .inst 0xd4200000

For other ARM, assembly: .inst 0xe7f001f0

For Alpha, assembly: bpt

For non-hosted C with GCC (or something which masquerades as it), __builtin_trap

Otherwise, include signal.h and

If defined(SIGTRAP) (i.e., POSIX), raise(SIGTRAP)

Otherwise, 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.



5> pixelbeat..:

这看起来像一个合适的compat库https://github.com/scottt/debugbreak

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有