【问题标题】:Help: Application crashes on accessing source code帮助:应用程序在访问源代码时崩溃
【发布时间】:2011-01-04 11:24:04
【问题描述】:

这是我在 VC++ 项目中插入的一个简单的 asm 代码。 addr_curr_ebp 是 EBP 指针的当前地址。它指向堆栈帧内的旧 EBP 值。这之后的 4 个字节是应用程序函数内部的返回地址。我从代码部分中提取了一个字节。我将我的代码与 gtalk、vlc 等其他应用程序一起运行。当我在代码中包含 ProbStat 1 和 2 时,应用程序总是崩溃。当我删除这些语句时,一切正常。你觉得这是什么?

__asm{
       push eax
       push ebx
       push cx

       mov ebx, addr_curr_ebp
       mov eax, [ebx + 4]

       mov cl, BYTE PTR [eax - 5]  //ProbStat 1
       mov ret_5, cl  // ProbStat 2

       pop cx
       pop ebx
       pop eax
}

【问题讨论】:

  • 是崩溃还是异常,具体发生在哪里?您是否尝试过将调试器设置为中断所有异常类型?
  • 只推CX 并没有节省任何费用。另请注意,MS 使用 ECX 寄存器作为 C++ 中的 this 指针。否则没有足够的信息来回答你的问题。
  • @JimR: 'push cx' 保存 cx 寄存器,'pop cx' 恢复它。在这两者之间,只有 cl 被改变。所以 ecx 被保留了。
  • @TonyK:你没抓住我的意思。 push ECX 不会更贵,而且可能更便宜,因为 CX 在进入堆栈之前必须扩大到 32 位。
  • @Bruce:如果您打开了该选项,也有可能是整个程序优化导致了这种情况。将其关闭并测试。​​

标签: c++ assembly inline-assembly


【解决方案1】:

您的代码 sn-p 不足以查看“ret_5”的位置。如果它是类的成员,您将自动崩溃。 ecx 寄存器存储“this”指针,你搞砸了。

不确定这是做什么的,听起来你需要使用 _ReturnAddress 内在函数。它返回调用此代码的调用指令之后的指令的地址。把它赋值给一个无符号的char*,这样就不需要组装了。

【讨论】:

  • 这个asm块中没有用到'this'指针,在exit之前恢复了,所以临时改一下ecx也没关系。但是,正如您所说,如果 ret_5 是类成员,那么代码将无法按预期工作。
  • @Hans:我使用 EDX 而不是 CX(只是为了确定),我将 ret_5 设为全局变量,但它仍然崩溃。对于 Gtalk,我收到一条错误消息,提示“Google Talk 遇到内部错误,现在必须关闭。可以向 Google 报告此错误吗?”
  • 点击是,也许奇迹会发生。我从提供的信息中没有任何线索,您需要改进您的问题。
  • 此代码是遍历所有堆栈帧的 Stack Walk 代码的一部分。我已将程序集插入到 StalkWalk 函数中,以在每个帧的返回地址之前提取 CALL 语句。那没什么花哨的。如果您需要更多信息,请告诉我
  • 当我点击是时没有奇迹发生:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多