将旧项目从 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 在运行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

将旧项目从 NHibernate 1.2 升级到 3.3

C++ Builder XE 无法从 BCB6 成功转换项目

将旧数据模型文件复制到新项目中进行轻量级核心数据迁移

将旧版 WCF 应用程序迁移到 CoreWCF

使用 PostgreSQL 从 liferay 5.2.3 迁移到 6.0.6 tomcat 时无法将旧权限算法转换为 5

将旧用户迁移到 symfony2