寄存器和调用参数中的奇怪值

时间:2014-09-26 10:09:00

标签: objective-c windbg gnustep

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

rdx=00000000 deadface

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

事实证明,GNUstep方法告诉程序试图在已经解除分配的对象上发送消息(=调用方法)。

如果对象被释放,GNUstep将0xdeadface设置为对象的isa指针的值。 isa指针引用该对象是该实例的类; objective-c运行时使用此指针在向其分派消息时解析对象的方法。

因此,每次尝试向解除分配的对象发送消息都会导致段错误,如果陷入调试器,通常会在寄存器或堆栈中显示0xdeadface