Warm tip: This article is reproduced from serverfault.com, please click

c-程序集x86编程调试(GDB):如何通过高级索引打印出数据

(c - Assembly x86 Programming Debugging (GDB): How to print out data through advancing indexing)

发布于 2020-11-28 10:41:55

我想知道如何通过GDB中的高级索引打印数据?例如,假设我要打印出8(%ebp)的值,以将第一个参数传递给函数。我该怎么做?以下命令似乎不起作用:

p (int)8 ($esp)

我总是收到此细分错误错误:

程序收到信号SIGSEGV,分段故障。0x00000008 in ?? ()正在调试的程序处于从GDB调用的函数中时发出信号。GDB保留在接收信号的帧中。要更改此行为,请使用“将unwindonsignal设置为开”。包含该函数(在0x0x8处)的表达式的求值将被放弃。函数执行完毕后,GDB将静默停止。

Questioner
Adam Lee
Viewed
11
Peter Cordes 2020-11-28 20:31:59

我认为8($esp)尝试8使用%esparg作为函数进行调用(但是绝对地址8不在有效的可执行页面中)。请记住,GDB使用GDB的类似于C的语法,而不是AT&T程序集寻址模式语法。

寄存器+偏移量几乎不是“高级索引”,但是无论如何,它很容易转换为GDB表达式:

x  $esp + 8

x命令检查该地址处的内存。help x看的格式和许多元素来显示如何选择。 p会打印地址,除非你将其转换为指针并像这样取消引用p *(int*)(8 + $esp)