2014-09-26 31 views
0

我有一个非常老的程序,崩溃了。在调试使用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运行时。

+1

有一个内存模式'deadbeef'代表'heapFree()'释放的内存' – 2014-09-26 13:30:40

+0

谢谢,很好的提示。刚刚发现'deadface'是GNUstep用于类似目的的一种模式。 – 2014-09-26 14:32:29

回答

2

事实证明,这是GNUstep的方式来告诉程序试图发送一个消息(=调用一个方法)对已经释放的对象。

如果一个对象被释放,GNUstep将0xdeadface设置为对象的isa指针的值。 isa指针指向对象是类的实例的类; objective-c运行时使用这个指针来解析对象的方法。因此,每次尝试向释放对象发送消息都会导致段错误,即如果在调试器中被捕获,通常会在寄存器或堆栈中显示0xdeadface