便携式相当于__debugbreak

时间:2013-07-07 22:04:50

标签: c++ gcc clang

我在Windows上使用__debugbreak()编写了一些代码,我想支持其他编译器,所以我希望创建一个更加可移植的版本(Clang和GCC)。

我现在拒绝使用内联汇编程序,因为它没有提供指定调试中断的独立于目标的方法。我也看了__builtin_trap(),但显然它并不真正允许其后的步骤/步骤和那种事情。我也看了this question,但接受的答案实际上没有指明我正在寻找的位 - “......”中的位。

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

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我可以确认__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下工作)。