【发布时间】:2022-01-02 07:16:32
【问题描述】:
编辑:感谢@NateEldredge,我在How to 'tag' a location in a C source file for a later breakpoint definition?中更好地定义了我的问题
我使用这些标签在 gdb 中设置断点。所以无论我在标签之后/之前添加/删除代码行,断点仍然是正确的。
如果我在编译选项中添加-Wno-error=unused-label,编译器不会对我大喊大叫,但标签会从程序集中消失。
如果相反,我在代码中使用__attribute__((unused)),结果是一样的:没有抱怨,但标签不见了。
是否有正确的方法来完成这项工作(而不仅仅是 hack)?
这是我的玩具示例:
int main(void){
int a = 15;
label: __attribute__((unused))
a = a + 23;
return a;
}
编译后得到:
main:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 15
add DWORD PTR [ebp-4], 23
mov eax, DWORD PTR [ebp-4]
leave
ret
这里是同一示例的交互式版本:https://godbolt.org/z/zTqd9bM6q
$ gcc --version
gcc (GCC) 10.3.1 20210422 (Red Hat 10.3.1-1)
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
【问题讨论】:
-
你可以在标签前
goto。 -
__asm__("label:");怎么样 -
这可能是个好问题。但是:您的示例代码应该在 here ,恕我直言。
-
由于这仅用于调试,您可以将标签的使用放在有条件编译的语句中(在
#if DEBUG … #endif之类的内部),例如volatile int x; switch(x) { case 0: goto foo; case 1: goto bar; … }。 -
请注意
__asm__("label:")可能会失败。在优化过程中,编译器可能会决定重复代码,导致标签在汇编代码中出现两次,这通常会导致编译失败。或者,当编译器确定执行永远无法通过它时,它可能会被删除(尽管在那里放置断点无论如何都是无用的,因为它永远不会被命中)。
标签: c assembly gcc compiler-flags