【问题标题】:Strange values in registers and call parameters寄存器和调用参数中的奇怪值
【发布时间】:2014-09-26 10:09:00
【问题描述】:

我有一个非常旧的程序,它崩溃了。在使用作为事后调试器安装的 Windbg 调试崩溃时,我注意到其中一个寄存器被设置为一个奇怪的值:

rdx=00000000deadface

导致崩溃(访问冲突)的线程的堆栈跟踪也包含一些可疑值:

objc_1!objc_msg_lookup+0x29: 00000000 6784a4c5 488b4a38 mov rcx,qword ptr [rdx+38h] ds:00000000deadfb06=????????????????

我从!analyze -v 命令的输出中包含的寄存器列表中获得了第一个值。第二个是由列出失败线程堆栈的命令生成的 (~9k)。

Windbg 是试图通过将这些值放入注册表和堆栈转储来告诉我一些事情,还是我只是某些旧测试代码或恶作剧的受害者(或者它只是一个巧合的值)?

该程序是用 obj-c 编写的,运行旧版本的 GNUstep 和 obj-c 运行时。

【问题讨论】:

  • 有一个内存模式deadbeef代表HeapFree()释放的内存
  • 谢谢,很好的提示。刚刚发现deadface 是 GNUstep 用于类似目的的模式。

标签: objective-c windbg gnustep


【解决方案1】:

事实证明,这是 GNUstep 方法来判断程序试图在已释放的对象上发送消息(=调用方法)。

如果一个对象被释放,GNUstep 将0xdeadface 设置为对象的isa 指针的值。 isa 指针指向对象是其实例的类; Objective-c 运行时使用这个指针在向它发送消息时解析对象的方法。

因此,每次向已释放对象发送消息的尝试都会导致段错误,如果被困在调试器中,通常会在寄存器或堆栈中显示0xdeadface

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多