是什么INT3指令,并调用__debugbreak之间的区别?

问题描述 投票:0回答:1

什么是__debugbreak?它的作用是触发SIGTRAP?是什么INT3和__debugbreak之间的区别?

debugging assembly x86 gdb interrupt
1个回答
2
投票

int3 is an x86 instruction

__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
© www.soinside.com 2019 - 2024. All rights reserved.