【问题标题】:Why does windbg title stack with childebp and args to child为什么windbg标题堆栈与childebp和args到child
【发布时间】:2018-10-02 17:45:58
【问题描述】:

我知道这可能听起来很挑剔,但我想知道这些语义是否有原因。

对我来说,Child 意味着它将传递给它要调用的函数的东西,但是如果你打破函数名称,那么给定的记录将已经存在并且不会改变。该记录显示该函数从其父函数接收到的内容。

假设我在 wmain 上中断并插入几行代码。 windbg 将报告:

 # ChildEBP RetAddr  Args to Child              
00 005dfeb8 009e138b 00000001 00ac9bc0 00acfac8 ASMTests!wmain+0x19 

现在这些值不会改变。 当我输入下一个函数 DoBuf0 时,它们不会改变,因此它们实际上不是子级的参数,它们是从父级接收的参数。 例如: 我的 wmain 将“buf0”作为第二个参数传递给 DoBuf0

 # ChildEBP RetAddr  Args to Child              
00 005dfe0c 009e1131 005dfe34 009e218c 005dfe74 ASMTests!DoBuf0
01 005dfeb8 009e138b 00000001 00ac9bc0 00acfac8 ASMTests!wmain+0x91

0:000:x86> da 009e218c 
009e218c  "buf0"

它们是父 (wmain) 传递给子 (DoBuf0) 的参数,但它们不会显示在父行上,而是显示在子行上。只是从父母那里称他们为 Args 不是更有意义吗?在上面的例子中, args to Child 暗示 DoBuf0 将把它们传递给它的孩子。

谢谢

【问题讨论】:

  • I want to know if there is a reason for these semantics。没有理由。 WinDbg 不是为普通用户设计的,他们需要解释函数参数的来源。我同意描述“来自父母的参数”会更好。
  • "Args from Parent" 也是一个坏名字,因为它们不一定是函数的参数(事实上,在 x64 上它们几乎从来不是)。看我的回答here

标签: windbg


【解决方案1】:

对我来说,孩子意味着那些是它将传递给它的函数的东西 要打电话了

窗口怎么会显示尚未发生的事情?你期待某种推测性的执行模拟吗? “孩子”是被调用的东西,并且调用在堆栈上留下了证据数据。

引用自 WinDbg 帮助

Raw args 显示传递给 功能。在基于 x86 的处理器上,此显示器包括第一个 传递给函数的三个参数(“Args to Child”)。

Addrs 显示各种与框架相关的地址。在基于 x86 的 处理器,此显示包括堆栈帧的基指针 ("ChildEBP") 和返回地址 ("RetAddr")。

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 2010-10-09
    • 2014-06-23
    • 2011-10-30
    • 2018-02-12
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多