c - 用 gdb 调试 c 程序以显示十六进制地址

标签 c linux debugging gdb

我有一个关于调试 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/

相关文章:

c++ - 使用 C++(windows) 在 VS 代码中调试 C++ 时出错

java - 在 Eclipse 中调试 List<Class> 对象?

c - 如何在 C 中包含和使用 cairo 图形库?

python - 如何制作启动Python脚本的Linux后台进程(在C中)

c++ - 调试帮助 : C++ error

Linux:用于非常规文件的 mmap()

c - 显示在给定地址 gdb 找到的值

c - 为什么余数运算符会因不同的数据类型而失败?

c - 如何从文本文件中将数据作为字符读取,然后将每个字符除以一个 int

c - *** 检测到堆栈粉碎 *** : <unknown> terminated Aborted (core dumped)