在使用 GDB 檢查標簽時,我對使用“&”感到困惑。
我正在關注 2008 年的一本書。作者的除錯器顯然顯示了存盤在標簽上的值。但是,我無法獲得相同的除錯器并且正在使用 GDB。我找到了可以使用以下方法查看值的地方:
(gdb) x/8c &Snippet
0x804a000 <Snippet>: 107 'k' 97 'a' 78 'N' 71 'G' 65 'A' 82 'R' 79 'O' 79 'O'
如果我改為呼叫x/8c Snippet,則會收到錯誤訊息,“'Snippet' 的型別未知;將其轉換為其宣告的型別”。
該x命令需要一個地址,我理解它&用作“地址”運算子,就像在 C 中一樣。在代碼中,我不需要使用&. 標簽不只是記憶體地址的人類可讀句柄嗎?我對為什么需要&在 GDB 中使用感到困惑。
該代碼定義了位元組“KANGAROO”在Snippet。然后它回圈 8 次,將字母 at 切換Snippet為小寫。
;; kangaroo.asm
section .data
Snippet db "KANGAROO"
section .text
global _start
_start:
nop ; start experiment
mov ebx, Snippet
mov eax, 8
DoMore: add byte [ebx], 32
inc ebx
dec eax
jnz DoMore
nop ; end experiment
section .bss
uj5u.com熱心網友回復:
GDB不僅僅是一個 asm 除錯器,事實上,它主要用于除錯已編譯的 C 程式和類似的東西。它對變數名/標簽的處理是圍繞 C 變數名語意設計的,而不是 asm 標簽語意。
如果 GDB 沒有符號型別資訊,它不知道它是否應該具有像 Cint全域變數這樣的值語意,使用裸名稱從該地址加載(具有一些 GDB 也不知道的寬度),或者像一個 C 陣列,其中使用裸名會衰減到地址(在大多數情況下)。或者是否是代碼標簽。
我認為舊的 GDB 曾經有一個默認值,但當前的 GDB 沒有。
您是正確的,最好將 asm 標簽視為具有類似 C 的語意char label[](在全域范圍內)。
特別是在 NASM 語法中,其中mov reg, name是絕對地址的 mov-immediate,不像 GAS .intel_syntax noprefix,它是負載,如 MASM。
有關生命意義的更多哲學思考(對于 asm 標簽),請參閱Is each variable and register name just a pointer in NASM Assembly?
如果您正在除錯從 C 編譯的程式,其中包含定義 a 的除錯資訊,char foo[8] = {1,2,3};您應該能夠使用它x /8c foo來查看那里的記憶體內容。
確實,我對此進行了測驗,它可以在 x86-64 Arch GNU/Linux 上與這個 C 程式一起使用
char foo[8] = {1,2,3};
int main(){}
$ gcc -g foo.c
$ gdb ./a.out
(gdb) ptype foo
type = char [8]
(gdb) p foo
$1 = "\001\002\003\000\000\000\000"
(gdb) x /8c foo
0x4028 <foo>: 1 '\001' 2 '\002' 3 '\003' 0 '\000' 0 '\000' 0 '\000' 0 '\000' 0 '\000'
(這是一個我沒有start編輯的 PIE 可執行檔案,所以此時地址只是相對于影像庫的偏移量。)
我不建議嘗試在 asm 中手動撰寫自己的除錯資訊元資料。但是,如果您想查看 GCC 的功能,您可以查看它的gcc -g -S輸出,例如,如果您取消選中指令過濾器,請在https://godbolt.org/z/q7EPT8jGG上查看。它主要是數字,例如:
.section .debug_info,"",@progbits
.Ldebug_info0:
.long 0x84
.value 0x5
.byte 0x1
.byte 0x8
.long .Ldebug_abbrev0
.uleb128 0x2
...
.long .LASF3
.uleb128 0x5
.string "foo"
.byte 0x1
.byte 0x1
.byte 0x6
.long 0x2e
.uleb128 0x9
.byte 0x3
.quad foo
.uleb128 0x6
.long .LASF5
.byte 0x1
.byte 0x3
.byte 0x5
.long 0x80
.quad .LFB0
.quad .LFE0-.LFB0
...
.data在為自己定義靜態存盤的 asm 旁邊foo[],還有 this 仍然存在 without gcc -g,但 GDB 知道如何處理它是不夠的。
.type foo, @object
.size foo, 8
(這是 GAS 語法;我不確定 NASM 的等價物。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/457487.html
