Gdb - 打印数组或数组元素,具有各种大小的元素

Eri*_*ang 5 assembly gdb

汇编代码( yasm):

section .data
src db 1,2,3
Run Code Online (Sandbox Code Playgroud)

数组的每个元素src都是 1 个字节。

在 中GDB,如何打印整个数组或指定索引处的元素,例如打印值为 2 的元素。

Eri*_*ang 5

好吧,我想在 @Michael Petch 的许可下自己给出一个答案,以便让未来的搜索者更清楚

代码和答案适用于x86-64 Linux 系统,变量在汇编部分定义.data


代码

tmp.asm ( yasm )

; yasm assembly program,
; compile: yasm -f elf64 -g dwarf2 tmp.asm && ld tmp.o
; execute: ./a.out

section .data
a db 1
b dw 2
c dd 4
d dq 0x1234567890abcde

arr_a db 1,2,3,4
arr_b dw 1,2,3,4
arr_c dd 1,2,3,4
arr_d dq 1,2,3,0x1234567890abcde

section .text
global _start

_start:
    mov rax,1

    ; exit
    mov eax,1
    mov ebx,5
    int 0x80
Run Code Online (Sandbox Code Playgroud)

在 GDB 中打印数组或数组元素

在GDB中:

  • p命令将变量视为4 字节
  • x命令会将变量视为8 字节

所以,需要不同的方式来打印一些大小为1/2/4/8字节的数据。

命令示例:

  • p为 4 个字节。
    • p/x c,打印c为 4 字节,这是默认值。
  • p带强制转换,用于 1 / 2 字节
    • p/x (char)a, 打印a为 1 个字节
    • p/x (short)b,打印b为2字节
  • x8字节
    • x/x &d,打印d为 8 字节,这是默认值。
  • x1 / 2 / 4 字节
    • x/bx &a,打印a为 1 个字节,
    • x/hx &b,打印b为 2 个字节,
    • x/wx &c,打印c为 4 字节,
  • p对于数组
    • p/x arr_c@4,打印arr_c为长度为 4 的数组,包含 4 个字节的元素,这是默认值。
    • p/x (char[4])arr_a,打印arr_a为长度为 4 的数组,包含 1 个字节的元素,
    • p/x (short[4])arr_b,打印arr_b为长度为 4 的数组,包含 2 个字节的元素,
    • p/x (long[4])arr_d,打印arr_d为长度为 4 的数组,包含 8 个字节的元素,
  • p对于单个数组元素
    • p/x ((long[4])arr_d)[1],视为arr_d长度为4的数组,包含8个字节的元素,并打印索引为1的元素。

尖端:

  • 似乎p可以打印 8 字节数组,但无法正确打印单个 8 字节值(不是数组的一部分)。在这种情况下,请x改用。

(这只是在我的机器上测试的,如果有问题请随时纠正。)