如何在gdb中使用逻辑地址?

时间:2012-04-27 16:06:36

标签: gdb x86 memory-segmentation

gdb提供读取或写入特定线性地址的功能,例如:

(gdb) x/1wx 0x080483e4
0x80483e4 <main>:       0x83e58955
(gdb) 

但是如何指定逻辑地址?我按照以下说明来了:

   0x0804841a <+6>:     mov    %gs:0x14,%eax

如何读取gdb中“%gs:0x14”的内存,或者将此逻辑地址转换为我可以在x命令中使用的线性地址?

注意:我知道在这条指令之后我可以简单地阅读%eax,但这不是我关心的问题

3 个答案:

答案 0 :(得分:4)

  

如何读取gdb中“%gs:0x14”的内存

您不能:GDB无法知道%gs引用的细分如何设置。

  

或将此逻辑地址转换为我可以在x命令中使用的线性地址

同样,你不能一般地做到这一点。但是,您似乎在32位x86 Linux上,并且可以那样做 - %gs设置为通过set_thread_area系统指向线程描述符调用

您可以在GDB中执行catch syscall set_thread_area,并检查参数(每个线程都有一个这样的调用)。实际执行此操作的代码是here。一旦你知道%gs的设置方式,只需在base_addr添加0x14,就可以了。

答案 1 :(得分:1)

Using GDB to read MSRs 中所回答,使用寄存器 $fs_base$gs_base 在 gdb 8 中是可能的。

答案 2 :(得分:0)

我认为最简单的方法是读取 EAX 寄存器的内容,因为您可以看到 %gs:0x14 的值已移至 EAX。

在 GDB 中,使用 break 在 0x0804841a 之后的地址处设置断点。例如

break *0x0804841e

然后运行程序就可以用

打印EAX寄存器的内容
info registers eax