【问题标题】:WinDbg: Colon in address, what does it mean?WinDbg:地址中的冒号是什么意思?
【发布时间】:2021-03-24 22:36:45
【问题描述】:

我有一个显示以下异常信息的故障转储:

0:000> .ecxr
eax=00000000 ebx=00000001 ecx=000000dc edx=000032f0 esi=00000020 edi=78746341
eip=00000000 esp=00000007 ebp=00000020 iopl=0         nv up di pl nz na po cy
cs=0014  ss=0034  ds=0000  es=1000  fs=df5c  gs=0000             efl=00000001
0014:00000000 ??              ???

为什么例外地址显示为0014:00000000,而不仅仅是00000000?据我了解,0014 是代码段,但我没有找到任何有关语法的文档。

另外,有没有办法将此语法转换为简单的绝对地址?

【问题讨论】:

  • 是的,冒号之前的部分是段,之后的部分是偏移量(在这种情况下是EIP)。
  • 通常在 32 位代码中,代码段的段基数为 0。除非您有其他证据,否则您应该继续该假设。所以线性地址是 0。地址 0 通常不会映射到任何地址空间,这就解释了崩溃。 (如果你有理由认为它不是 0,Windbg 可能会告诉你第 14 段的真实段基数。)

标签: x86 windbg memory-address memory-segmentation


【解决方案1】:

是的,seg:off 是 100% 标准符号。它只是向您显示完整的 CS:EIP 值。

CS 基数是 0,除非你做了一些真正奇怪的事情(例如 retf 将某些东西弹出到 CS 中,碰巧索引了一个非零基数的 GDT 条目,如果甚至有一个)。

所以线性地址就是00000000。例如当 ESP 指向 0 而不是你的返回地址时,你试图跳转到 NULL 函数指针或其他东西,或者试图 ret

【讨论】:

  • 谢谢。知道为什么要显示该段吗?通常它不是显示地址的一部分。
  • @Paul:不知道为什么 WinDBG 认为这是一个好主意。当前 CS 值已经单独显示。纯粹是 UI 设计的选择。 GDB 没有; GDB 是围绕平面内存模型构建的便携式调试器(适用于各种 ISA)。 IDK 如果 WinDBG 起源于 16 位领域,seg:off 实际上很重要,因为正常的内存模型不是平坦的。或者,如果作者对 16 位 x86 有很多经验,那么将当前程序计数器显示为 seg:off 似乎很自然。
  • @Paul:或者它对调试可能在代码段之间远跳以切换模式的内核代码很有用?不过,如果 WinDBG 可以调试内核,则 IDK。
  • WinDbg 可以用作内核调试器,但这是用户模式的故障转储。
  • @Paul:是的,但我不希望它根据您是否在调试内核而改变其输出格式。内核调试是用例之一这一事实意味着将故障地址打印为cs:eipcs:rip 是有道理的。 (虽然内核也会使用 CS base = 0,所以它只是为了帮助内核开发人员注意我猜的 CS 值。)
猜你喜欢
  • 2011-01-13
  • 2012-10-09
  • 2020-05-21
  • 1970-01-01
  • 2019-09-14
  • 2012-09-25
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
相关资源
最近更新 更多