我一直在使用 intel OneAPI 编译器在 Visual Studio 2022 中编写 Fortran 代码。代码编译正确并且运行良好。最近,当我尝试调试代码时,我无法在本地或快速监视中查看数组变量的值,并收到消息“未定义地址”或“未定义变量xxx”。其中xxx是全局定义的cell_obj类型变量。
对于前。 cel(i)%nn - 是具有 "i" 个单元格的数量密度数组。当我想在快速监视中查看 cel(30)%nn 处的值时,我收到消息“未定义的变量 cel”。代码运行没有任何问题,并且所有输出文件都正确打印。当我使用 print 语句时我什至可以看到该值,但在调试期间无法快速监视。
过去两年我一直在使用这段代码进行研究,从来没有遇到过最近开始出现的这个问题。我不记得对设置或代码进行过任何更改。另外,根据其他帖子中的一些建议,我确保禁用优化并且项目在调试配置而不是发布配置下运行。
如果您能深入了解这种情况,我将不胜感激。
谢谢你
您所描述的问题(尽管代码运行正确,但在调试期间无法访问数组变量)可能与调试环境和 Fortran 编译器设置的组合有关。以下是一些可能的原因和解决方案,可帮助解决该问题:
确保为您的代码正确生成调试符号。您可能意外丢失了这些设置。
转到 Visual Studio 中的项目属性。
导航到 Fortran > 调试。
确保启用“生成调试信息”选项。通常应将其设置为 Full (/debug:full)。
即使您提到优化被禁用,最好还是仔细检查一下,因为优化会影响调试器中的变量可见性。
在项目属性中,转到 Fortran > 优化。
确保“优化”设置为禁用 (/O0)。
确保您使用的是英特尔调试器或适用于 Fortran 的兼容调试器。如果您使用默认的 Microsoft 调试器,它可能无法正确处理 Fortran 结构。
检查 Visual Studio 中的工具 > 选项 > 调试,并确保使用正确的调试器。
如果您有权访问英特尔的调试器(OneAPI 的一部分),请尝试显式选择它。
如果变量 cel 是全局变量,调试器无法访问它:
确保 cel 在代码中显式声明为全局(例如,使用 COMMON、MODULE 或 USE 语句)。
如果使用 MODULE,请确保模块已正确编译并且对调试器可见。
有时,由于调试器的限制,大型或复杂的全局变量可能无法正确显示。为了缓解这种情况,请考虑简化或重构全局变量的访问方式。
有时,构建工件可能会导致问题。对您的项目执行干净的构建:
在 Visual Studio 中选择“生成”>“清理解决方案”。
然后,使用“构建”>“重建解决方案”重建项目。
调试大型或派生类型(如 cel(i)%nn)有时可能会失败,原因是:
调试数据库文件(.pdb 文件)损坏。删除这些文件并重建解决方案。
数组边界检查可能被禁用,导致调试器映射内存的方式混乱。
在 Fortran > 运行时设置中启用数组边界检查。
英特尔 OneAPI Fortran 编译器的更新或更改可能会导致意外行为。确保您的编译器是最新的:
访问 Intel OneAPI 网站检查更新。
或者,如果更新后出现问题,则恢复到早期版本的编译器。
虽然不理想,但如果调试器始终无法显示特定变量,请使用打印语句作为解决方法。有时,重组代码或简化表达式也可以帮助调试器更好地处理变量。
通过在编译器选项中添加 /traceback 或 /check:bounds 等标志来启用详细的运行时调试。这些可以提供更多背景信息并帮助隔离问题。
如果问题仍然存在,请考虑联系英特尔的支持团队或在其官方论坛上发帖。包括以下详细信息:
Intel Fortran 编译器版本。
Visual Studio 版本。
如果可能的话,最小的重现器代码。