Debugging int3指令和调用调试中断之间有什么区别?

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和调试中断之间的区别是什么

这将使编译器在编译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;}
编译成这个()

这将使编译器在编译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的某个地方有一个存根…