Delphi XE3。我在应用程序中使用JCL错误对话框和打开FullDebug的FastMM,并将"垃圾"附加到堆栈跟踪(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生成堆栈跟踪。。。所以修复一个,修复所有。
这是JCL的.map文件解析器中的一个错误。
参见http://sourceforge.net/p/fastmm/discussion/443400/thread/82b024dc/
详细的线程和建议的修复。
您的Release配置可能不包括堆栈帧编译器选项(默认情况下不包括)。如果没有将这些信息编译到可执行文件中,堆栈跟踪显示的是运行时包导出的名称。解决方案是在调试模式下编译,或者在发布配置的编译器选项中打开堆栈帧。
仔细研究后,我得出结论,这是没有问题,只是我的误解,可能还有一些过时的代码:
$qqrv和其他文本都是有效且可能有用的信息,因此与其想办法删除它,不如学习如何使用它。上面问题中的链接为这项工作提供了良好的基础。