1

德尔福 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

当应用程序为 Release 编译时。当我为调试编译时,堆栈跟踪是“干净的”。由于我在 FastMM 和 JCL 报告中看到了相同类型的“垃圾”,我认为这两个库都不会造成麻烦。

我说的是带引号的“垃圾”,因为 $qqv 似乎是恒定的,并且字符串的其余部分因运行而异。

我已检查(并重新检查)地图文件和符号设置以及 JCL 符号,但在设置中看不到任何不同。

编辑:毫不奇怪,根本原因是相同的,因为 FastMM 是(我认为)使用 JCLDebug 生成堆栈跟踪......所以修复一个,修复所有。

4

3 回答 3

1

这是 JCL 的 .map 文件解析器中的一个错误。

http://sourceforge.net/p/fastmm/discussion/443400/thread/82b024dc/

对于详细的线程和建议的修复。

于 2013-12-18T04:40:19.940 回答
0

在研究完所有内容后,我得出结论认为这问题,只是我的误解和一些陈旧的代码:

$qqrv 和其他文本都是有效且可能有用的信息,因此与其找到删除它的方法,不如学习如何使用它。上述问题中的链接为这项工作提供了良好的基础。

于 2013-12-19T15:10:11.253 回答
0

可能您的发布配置不包括堆栈帧编译器选项(默认情况下不包括)。如果没有将此信息编译到可执行文件中,堆栈跟踪显示的是运行时包导出的名称。解决方案是在 Debug 模式下编译,或者在 Release 配置的编译器选项中打开堆栈帧。

于 2013-12-16T16:12:00.693 回答