【问题标题】:Gdb - print array or array element, with element of various sizeGdb - 打印数组或数组元素,包含各种大小的元素
【发布时间】:2016-06-16 04:24:15
【问题描述】:

汇编代码(yasm):

section .data
src db 1,2,3

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

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

【问题讨论】:

  • p/x (char[3])src ?打印 3 个元素的整个数组。
  • @MichaelPetch 酷!似乎p/x ((char[4])src)[1] 可以打印数组的单个元素。如果你把它作为答案,我会接受它。
  • 随时提出答案。很高兴它有帮助。

标签: assembly gdb


【解决方案1】:

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

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

【讨论】:

  • x/s &string 如果string 是一个字节数组。
猜你喜欢
  • 2020-04-08
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多