Debugging int3指令和调用调试中断之间有什么区别?
什么是休息?它是用来触发信号陷阱的吗?int3和调试中断之间的区别是什么 这将使编译器在编译x86或任何适合目标ISA的软件断点指令(例如ARM、AArch64等)时发出该指令 ICC也支持它,但其他编译器(如gcc)不支持 在asm中,您不会调用debugbreak,您只需编写Debugging int3指令和调用调试中断之间有什么区别?,debugging,assembly,x86,gdb,interrupt,Debugging,Assembly,X86,Gdb,Interrupt,什么是休息?它是用来触发信号陷阱的吗?int3和调试中断之间的区别是什么 这将使编译器在编译x86或任何适合目标ISA的软件断点指令(例如ARM、AArch64等)时发出该指令 ICC也支持它,但其他编译器(如gcc)不支持 在asm中,您不会调用debugbreak,您只需编写int3。e、 如果你编译一个使用它的函数,比如 void foo() { __debugbreak(); } Godbolt编译器资源管理器上的MSVC生成此asm: void foo(void) PROC
int3
。e、 如果你编译一个使用它的函数,比如
void foo() {
__debugbreak();
}
Godbolt编译器资源管理器上的MSVC生成此asm:
void foo(void) PROC ; foo
npad 2
int 3
ret 0
请注意,任何地方都没有调用
指令。这是一个内在的“内联线”,即使优化禁用。它不仅仅是一个函数
这与
\u mm\u mfence()
是mfence
指令的固有属性,或是\u mm\u popcnt\u u64
是64位操作数大小popcnt
的固有属性相同
相关:
说clang有一个
\u内置调试陷阱()
另一个答案是,更广泛使用的GNU C\u内置trap()
被假定为停止/中止程序,而不是充当断点。(因此gcc在无条件的\uuuu内置\uu陷阱
之后不会发出任何代码)
更新:显然,MSVC允许您获取其地址,所以我猜在某处有它的库版本。这样您就可以在asm中编写
call\uu 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&uu debugbreak;}
编译成这个()
这将使编译器在编译x86或任何适合目标ISA的软件断点指令(例如ARM、AArch64等)时发出该指令
ICC也支持它,但其他编译器(如gcc)不支持
在asm中,您不会调用debugbreak,您只需编写int3
。e、 如果你编译一个使用它的函数,比如
void foo() {
__debugbreak();
}
Godbolt编译器资源管理器上的MSVC生成此asm:
void foo(void) PROC ; foo
npad 2
int 3
ret 0
请注意,任何地方都没有调用
指令。这是一个内在的“内联线”,即使优化禁用。它不仅仅是一个函数
这与
\u mm\u mfence()
是mfence
指令的固有属性,或是\u mm\u popcnt\u u64
是64位操作数大小popcnt
的固有属性相同
相关:
说clang有一个
\u内置调试陷阱()
另一个答案是,更广泛使用的GNU C\u内置trap()
被假定为停止/中止程序,而不是充当断点。(因此gcc在无条件的\uuuu内置\uu陷阱
之后不会发出任何代码)
更新:显然,MSVC允许您获取其地址,所以我猜在某处有它的库版本。这样您就可以在asm中编写
call\uu 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&uu debugbreak;}
编译成这个()
在我熟悉的平台上,这两个映射到同一个对象。在我熟悉的平台上,这两个映射到同一个对象。\u debugbreak是一个函数。你能详细解释一下为什么我们不能在asm中称之为这个吗?@anandthegreat:Updated。它不仅仅是一个函数,在asm中没有理由不将其作为
int3
内联,除非您将地址作为函数指针。我很惊讶MSVC甚至在库中有它的非内联版本。GCC不允许您获取内置函数的地址。@PeterCordes然而,(甚至可以追溯到VS2015),所以IDK。也就是说,kernel32.dll
中有一个存根,所以有可能在vcrt的某个地方有一个存根…\u debugbreak是一个函数。你能详细解释一下为什么我们不能在asm中称之为这个吗?@anandthegreat:Updated。它不仅仅是一个函数,在asm中没有理由不将其作为int3
内联,除非您将地址作为函数指针。我很惊讶MSVC甚至在库中有它的非内联版本。GCC不允许您获取内置函数的地址。@PeterCordes然而,(甚至可以追溯到VS2015),所以IDK。也就是说,kernel32.dll
中有一个存根,所以有可能在vcrt的某个地方有一个存根…