什么是__debugbreak?它的作用是触发SIGTRAP?是什么INT3和__debugbreak之间的区别?
__debugbreak()
is an intrinsic supported by MSVC,将让编译器发出的x86编译时该指令,或任何软件断点指令是适合目标ISA(例如ARM,AArch64等)
ICC也支持,但其他的编译器(如GCC)不..
你不会做call __debugbreak
在ASM,你只写int3
。例如如果您编译使用它,就像一个功能
void foo() {
__debugbreak();
}
MSVC的Godbolt编译器产生的探险家这ASM:
void foo(void) PROC ; foo
npad 2
int 3
ret 0
注意缺乏call
指令的任何地方。这是一个内在的是“内联”,甚至与优化禁用。这不是“公正”的功能。
这是相同的_mm_mfence()
如何是本征的mfence
指令,或_mm_popcnt_u64
对于64位操作数大小popcnt
。
相关:Is there a portable equivalent to DebugBreak()/__debugbreak?
说铛具有__builtin_debugtrap()
。
有另一种回答说,更广泛地提供GNU C __builtin_trap()
假定停止/退出程序,并不像一个断点。 (因此,GCC将不会无条件__builtin_trap
后发出的任何代码。)
更新:显然是MSVC确实让你把它的地址,所以我想有一个库版本的某处。所以,你可以在ASM写call __debugbreak
,但你还是不会,因为它是没有意义的。
GCC不会让你带内建的地址,例如试图编译:
int (*getbuiltin(void))(unsigned) { return &__builtin_popcount; }
为您提供了这个错误:
error: built-in function '__builtin_popcount' must be directly called
但是,MSVC和ICC编译void (*getFunc(void))(void) { return &__debugbreak; }
到这个(on Godbolt)
void (__cdecl*getFunc(void))(void) PROC ; getFunc
lea rax, OFFSET FLAT:__debugbreak
ret 0