2013-12-13 136 views
1

Delphi XE3。我使用的JCL錯誤對話框,FastMM與FullDebug在我的應用程序打開並收到「垃圾」的堆棧跟蹤(JCL都和FastMM)附加到符號:

[74EA3D67] RaiseException 
    [0041815D] FastMM4.TFreedObject.VirtualMethodError$qqrv 
    [0054FEC5] Vcl.Controls.TWinControl.CMInvalidate$qqrr24Winapi.Messages.TMessage 

,當我想什麼是:

[74EA3D67] RaiseException 
    [0041815D] FastMM4.TFreedObject.VirtualMethodError 
    [0054FEC5] Vcl.Controls.TWinControl.CMInvalidate 
    [00548735] Vcl.Controls.TControl.WndProc 

當應用程序被編譯爲發佈。當我爲Debug進行編譯時,堆棧跟蹤是「乾淨的」。由於我在FastMM和JCL報告中看到了同樣的「垃圾」,我認爲這不是要給圖書館帶來麻煩。

我在說引用「垃圾」,因爲$ qqv似乎是不變的,而字符串的其餘部分因運行而異。

我已檢查(並重新檢查)地圖文件和符號設置以及JCL符號,在設置中我看不到任何不同的東西。

編輯: 毫不奇怪,其根本原因是相同的,因爲FastMM是(我認爲)使用JCLDebug生成堆棧跟蹤...所以修復一個,修復所有。

+0

沒有什麼是錯誤的,這個'$ qqrv'這個mangling的含義是一個問題。 – kludg

+0

我發現了這篇文章(譯自德語),它解釋了在德爾福發生的變形。例如,'qqr'的意思是'register'調用約定 - http://translate.google.com/translate?prev=hp&hl=zh-CN&js=y&u=http%3A//edn.embarcadero.com/article/27758&sl=de&tl=en&history_state0 = – kludg

+0

什麼是「錯誤」是堆棧跟蹤可能會/應該是可讀性差,正如您所說,它似乎是故意的名稱損壞。感謝頁面鏈接。 –

回答

0

可能您的發佈配置不包括堆棧幀編譯器選項(默認情況下,它不包含)。沒有將這些信息編譯到可執行文件中,堆棧跟蹤顯示的是運行時軟件包導出的名稱。解決方案是在Debug模式下編譯,或者在Release配置的編譯器選項中打開堆棧幀。

+0

我只是檢查,我*做*在釋放(它的測試版,所以很多調試留在)堆棧幀 –

+0

現在無法檢查,因爲我沒有安裝JCL調試,但調試信息打開呢? –

0

尋找到這一切後,我斷定這是沒有問題,只是我的誤會,也許有點陳舊代碼:

的$ qqrv和其他文字都是有效的,潛在有用的信息,因此而比找到一種方法來消除它會更好地學習如何使用它。上述問題中的鏈接爲這項工作提供了良好的基礎。