我在Windows上使用__debugbreak()
编写了一些代码,我想支持其他编译器,所以我希望创建一个更加可移植的版本(Clang和GCC)。
我现在拒绝使用内联汇编程序,因为它没有提供指定调试中断的独立于目标的方法。我也看了__builtin_trap()
,但显然它并不真正允许其后的步骤/步骤和那种事情。我也看了this question,但接受的答案实际上没有指明我正在寻找的位 - “......”中的位。
我也看到了Clang关于支持这个的一些补丁,但显然Clang仍然拒绝包含__debugbreak()
的代码。
有什么建议吗?
答案 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下工作)。