我已经在Windows上用__debugbreak()写了一些代码,而且我想支持其他编译器,所以我希望创建一个这个函数的更可移植的版本(Clang和GCC)。
我现在拒绝使用内联汇编程序,因为它不提供指定调试中断的独立于目标的方法。我也看过__builtin_trap(),但显然它并不允许,例如,后退/后退之类的事情。我也看过this question,但公认的答案实际上并没有指定我正在寻找的那一位--在"...“中的那一位。
我也看到了Clang的一些补丁来支持这一点,但显然Clang仍然拒绝了包含__debugbreak()的代码。
有什么建议吗?
发布于 2013-07-08 06:28:14
我可以确认,__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上,32位和64位模式,都是用gcc和clang编译的)
我找到了这个博客:http://mainisusuallyafunction.blogspot.co.uk/2012/01/embedding-gdb-breakpoints-in-c-source.html
但它需要一个脚本来解析可执行文件(在Windows下可能根本不起作用)。
https://stackoverflow.com/questions/17516855
复制相似问题