我有一个非常老的程序,崩溃了。在使用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运行时。
答案 0 :(得分:2)
事实证明,GNUstep方法告诉程序试图在已经解除分配的对象上发送消息(=调用方法)。
如果对象被释放,GNUstep将0xdeadface
设置为对象的isa
指针的值。 isa
指针引用该对象是该实例的类; objective-c运行时使用此指针在向其分派消息时解析对象的方法。
因此,每次尝试向解除分配的对象发送消息都会导致段错误,如果陷入调试器,通常会在寄存器或堆栈中显示0xdeadface
。