我有一个关于调试 C 代码的问题。我做了研究,但它并不令我满意。 我知道以下命令:
(gdb) x/x 'address' #show hexadecimal address
(gdb) x/100s 'address' #show next 100 decimals
(gdb) x/10b 0x0804846c-10 #show byte at 0x0804846c-10
(gdb) x/10b 0x0804846c+20 #show byte at 0x0804846c+20
(gdb) x/10x 0x0804846c show 10 addresses at 0x0804846c
(gdb) x/10x $esp #show next 10 addresses at esp register
但我想知道 x/10x $esp - 50
到底做了什么?
我明白了吗?是否正确?
“它显示 $esp 之前的 50 个地址到它之后的 10 个地址” 如果你告诉我完全纠正我,我将不胜感激...... :(
最佳答案
检查从地址 (ESP-50) 开始的 10 个十六进制单词。
当你执行 $esp-50 时,你在内存中向前看,因为堆栈从最大内存增长到最小内存。
试试这个来更好地理解 gdb 给你的是什么
x/10xw $esp-1 你在这里查看较低的内存地址,你正在从 $esp -1 读取 1byte ($esp -1 不在你的栈帧中,栈从大地址增长到你当前的小地址栈帧在 $esp 处结束,$esp -1 是一些随机内存)
x/10xw $esp//这会打印你真正想看的东西,打印所有从当前 $esp 及以下被压入堆栈的内容
x/10xw $esp+1//对于这个,你将丢失 1 个字节,因为还有 1 个字节被压入堆栈,但你正在跳过它
堆叠
Lower Memory addresses
^$esp -1 random garbadge in memory
^$esp local function variables 0
^$esp +1 local variable 1
^ local variable 2
^ local variable 3
^ local variable 4
Higer Memory Addresses
所以当你说 x/10xw $esp gdb 打印 $esp 以下的所有内容(但下面意味着更高内存地址中的所有内容看图)
关于c - 用 gdb 调试 c 程序以显示十六进制地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21189156/