将旧项目从 C++Builder 10.2 迁移到 10.2.3 在运行时崩溃
Posted
技术标签:
【中文标题】将旧项目从 C++Builder 10.2 迁移到 10.2.3 在运行时崩溃【英文标题】:Migration of old project from C++Builder 10.2 to 10.2.3 crashes at runtime 【发布时间】:2018-05-16 08:49:45 【问题描述】:我很难将我们的旧 C++Builder 10.2 项目升级到 10.2.3(我们在 64 位 PC 上使用 Clang 编译器,32 位应用程序)。
10.2.3 安装顺利(在干净的 Windows 10 PC 上), - 项目编译和链接 - 到目前为止,每个人都很开心。
但是,当在调试器中运行应用程序时,我可以看到 MainForm 的 this
指针(一个相当大的对象,出于历史原因)在单个方法调用调用中突然变为垃圾(当调用其中一个它自己的方法 - 就在构造函数完成之后),这会导致严重的失败。
我试图注释掉特定方法的 __fastcall
调用约定,然后调试器走得更远,但由于 this
指针损坏(我们__fastcall
有 1000 多个方法,因此不能将它们全部注释掉)。
有人知道发生了什么吗?
也许是一个新的 Clang 编译器开关?
大物体有问题吗?
我还尝试在 10.2.3 中从头开始构建一个全新的项目 - 但没有运气 - 同样奇怪的事情发生了。
【问题讨论】:
没有代码或任何与所用技术相关的描述,就不可能模仿行为或调试。如果您从头开始创建新应用程序并且崩溃可能是您应该共享其代码。另外你确定旧编译的应用程序正在新的 Windows 安装上工作(过去有问题实际上是新的 Windows 更新/版本导致了问题而不是新的编译器)? 在32位__fastcall
中,this
指针被携带在EAX
cpu寄存器中。在每个__fastcall
方法调用期间,使用调试器准确找出是什么在破坏该寄存器。听起来可能clang编译器没有正确设置调用堆栈。您在代码中使用 C++11 吗?如果没有,请尝试切换回旧版 Borland 编译器,看看是否会发生同样的问题(它不应该发生)。
嗨 Remy - 感谢您的回答。切换回经典编译器对我们来说不再可能,因为我们大量使用现代 C++(无论如何切换到 Clang 的主要原因)。我将尝试调试并密切关注 EAX CPU 寄存器
@Spektre :是的,我们相当旧的代码库在 10.2 下编译时运行良好,没有任何问题。我们在调试器上遇到了一些困难,这就是我们现在尝试升级到 10.2.3 的原因。在 Windows 7 和 10 PC 上都可以看到“this”指针问题
按钮行结论是:'_chkstk' 在 10.2.3 中使堆栈帧崩溃 解决方案:避免将“大”对象/数组放在堆栈上 - 而是考虑使用堆存储,即新的 std: :shared_ptr, std::unique_ptr, ...等
【参考方案1】:
这是 Clang 编译器中的一个已知错误,已向 Embarcadero 报告:
RSP-12769: bcc32c have problems with __fastcall calling convention
RSP-20171: Tokyo 10.2.3 clang destroys this pointer if stack is large
RSP-20173: BCC32C parameter corruption with more than 4KB of data on a stack frame
Embarcadero 的 CodeCentral 上提供了针对 10.2.3 Tokyo 中 Clang 编译器的补丁:
ID: 30834, C++Builder 10.2.3 C++ Compiler 4k Stack Allocation Patch
【讨论】:
啊好吧,-如果您知道要寻找什么,那么您的问题可能会有答案/结论:-)。感谢您的信息以上是关于将旧项目从 C++Builder 10.2 迁移到 10.2.3 在运行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章
C++ Builder XE 无法从 BCB6 成功转换项目
使用 PostgreSQL 从 liferay 5.2.3 迁移到 6.0.6 tomcat 时无法将旧权限算法转换为 5