【问题标题】:Portable equivalent of __debugbreak可移植的 __debugbreak
【发布时间】:2013-07-05 04:59:28
【问题描述】:

我已经在 Windows 上使用 __debugbreak() 编写了一些代码,并且我想支持其他编译器,因此我希望创建此函数的更便携版本(Clang 和 GCC)。

我暂时拒绝使用内联汇编程序,因为它没有提供与目标无关的方法来指定调试中断。我也看过__builtin_trap(),但显然它并没有真正允许例如之后介入/跨过之类的事情。我还查看了this question,但接受的答案实际上并没有指定我正在寻找的位 - “...”中的位。

我也看到了一些 Clang 的补丁支持这个,但显然 Clang 仍然拒绝包含 __debugbreak() 的代码。

有什么建议吗?

【问题讨论】:

    标签: c++ gcc clang


    【解决方案1】:

    我可以确认__builtin_trap() 没有为您提供正确类型的断点以在 gcc 中继续。它给出了一个illegal opcode trap,它根本不允许代码继续运行 - 如果你在 gdb 中执行 next,它只会以 SIGILL 退出,如果你真的想要能够,这并不是特别有用继续。

    据我所知,唯一的解决方案是使用内联汇编程序。我尝试在“hello, world”程序中使用int 3,尽管gdb 无法识别断点,但它确实在指令处停止,并且我能够在中断后继续。

    #include <stdio.h>
    
    #define BREAKPOINT \
        asm("int $3")
    
    int main()
    {
    
        BREAKPOINT;
    
        printf("Hello, world!\n");
        return 0;
    }
    

    (在 Linux x86_64 上同时使用 gcc 和 clang 编译,32 位和 64 位模式)

    我确实找到了这个博客: http://mainisusuallyafunction.blogspot.co.uk/2012/01/embedding-gdb-breakpoints-in-c-source.html

    但它需要一个脚本来解析可执行文件(并且可能根本无法在 Windows 下工作)。

    【讨论】:

      猜你喜欢
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2020-01-30
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多