2014-09-26 65 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