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

Objective c 寄存器和调用参数中的奇怪值,objective-c,windbg,gnustep,Objective C,Windbg,Gnustep,我有一个非常旧的程序,它崩溃了。在使用Windbg调试崩溃时,我注意到其中一个寄存器被设置为一个奇怪的值: rdx=00000000deadface 导致崩溃(访问冲突)的线程堆栈跟踪也包含一些可疑值: objc_1!objc_msg_查找+0x29: 00000000 6784a4c5 488b4a38 mov rcx,qword ptr[rdx+38h]ds:00000000死的 我已经从寄存器列表中获得了第一个值,它包含在的输出中!analyze-v命令。第二个是由列出失败线程堆栈的命令生

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

rdx=00000000
deadface

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

objc_1!objc_msg_查找+0x29:
00000000 6784a4c5 488b4a38 mov rcx,qword ptr[rdx+38h]ds:00000000死的

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

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


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

结果表明,这是GNUstep告知程序试图在已解除分配的对象上发送消息(=调用方法)的方式

如果对象被解除分配,GNUstep将
0xdeadface
设置为对象的
isa
指针的值<代码>isa
指针指向对象是其实例的类;objective-c运行时在向对象分派消息时使用此指针解析对象的方法


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

有一个内存模式
deadbeef
,表示通过
HeapFree()解除分配的内存。
谢谢,很好的提示。刚刚发现,
deadface
是GNUstep用于类似目的的模式。