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

时间:2016-06-16 04:24:15

标签: assembly gdb

汇编代码(yasm):

section .data
src db 1,2,3

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

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

1 个答案:

答案 0 :(得分:2)

好的,我想通过@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

在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字节
  • x 8个字节
    • x/x &d,将d打印为8字节,这是默认值。
  • x为1/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

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