編輯:感謝@NateEldredge,我更好地定義了我的問題如何在 C 源檔案中“標記”一個位置以便以后定義斷點?
我使用這些標簽在 gdb 中設定斷點。所以無論我在標簽之后/之前添加/洗掉代碼行,斷點仍然是正確的。
如果我添加-Wno-error=unused-label到編譯選項中,編譯器不會對我大喊大叫,但標簽會從程式集中消失。
如果相反,我__attribute__((unused))在代碼中使用,結果是一樣的:沒有抱怨,但標簽消失了。
有沒有正確的方法來完成這項作業(而不僅僅是一個黑客)?
這是我的玩具示例:
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.
uj5u.com熱心網友回復:
如果您想要一個不會被洗掉或重命名的標簽,請嘗試以下操作:
asm volatile("mylabel:");
請注意,擁有此標簽可能會影響 GCC 如何優化您的函式。但是,volatile關鍵字可能有助于防止它做任何會導致問題的事情。
另請注意,您可以使用__asm__代替asm. 兩者似乎都在 GCC 中作業。
uj5u.com熱心網友回復:
您可以使未使用的標簽警告靜音...使用它:
int main(int argc, char** argv) {
int a = 15;
goto label; label:
a = a 23;
return a;
}
這會將標簽保留在程式集中(盡管使用內部名稱):
main:
.LFB0:
push ebp
mov ebp, esp
sub esp, 16
mov DWORD PTR [ebp-4], 15
nop
.L2:
add DWORD PTR [ebp-4], 23
mov eax, DWORD PTR [ebp-4]
leave
ret
我建議使用宏來減少作業量并更好地顯示意圖:
#define DEBUG_LABEL(x) goto x; x:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/364731.html
上一篇:c編程鏈表編譯但段錯誤
下一篇:C中不止一個重復的元素
