到达主函数结束后发生调试运行时堆栈错误

Debugging runtime stack error occurring once end of main function is reached

本文关键字:调试 运行时 堆栈 错误 函数 结束      更新时间:2023-10-16

我已经使用f2c转换器(f2c(将一些遗留的Fortran代码转换为C,并在Windows 7(64位(上创建了一个Visual Studio 10解决方案。我还必须将我的C++程序(test.cpp,包含我的主要函数(与 f2c 库(使用 nmake 在我的系统上构建(链接起来。

程序运行,但是一旦到达主函数的末尾,我会收到以下调试错误:

Stack around the variable 'qq' was corrupted
Stack around the variable 'pf' was corrupted
Stack around the variable 'ampls' was corrupted

我想知道这是否可能是由于 f2c 转换器在转换后的 C(来自 Fortran(文件中进行的"更正":

/* Parameter adjustments */
--x1;
--xabs;
--ximag;
--xreal;
--work4;
--work3;
--work2;
--work1;
--ampls;
--pf;
--qq;
--tri;

这似乎有点奇怪,因为所有这些变量都是 C 数组,我认为 f2c 程序只是在做一些指针算术,以便数组中的索引 0 成为索引 1,类似于 Fortran。

我不知道这是否也是由于转换后的代码访问尚未分配的数组元素时出现问题。

调试此错误并修复它的最佳方法是什么?

潜在原因:

  • 此错误通常与在数组(动态或静态数组(边界之外写入有关。此错误可以通过在 -ve 索引或索引>= size_of_array中写入\获取值来发生。
  • 如果指针未设置为正确的位置,也会发生此错误。(例如 ptr = 0ptr = 55 指向已删除(释放;或已释放(的内存或任何无效地址(

在我脑海中调试错误的最佳方法是逐步调试您的 prorgam 并观察这些指针值。他们一定有什么问题。

你说的可能是真的。我建议创建一个非常小的程序,它使用数组并像 f2c 一样递减指针。类似的东西

int aa[10];
int *pa = aa;
--pa;
pa[1] = ...

也就是说,在小规模上测试可疑代码。您可以通过这种方式隔离问题的原因。(寻找解决方法是另一回事(

您是否正在使用 crt 的调试版本进行编译? 这可能会为您提供更多信息。

另外,您的库是否有可能构建为 C 而您的应用程序编写为 C++?

您提到的那些错误有时是由于不同的调用约定。 您确实声明它是一个 64 位应用程序,因此它应该不是问题(所有 64 位应用程序都使用相同的调用约定(,但值得研究。

是否可以将所有 fortran 转换后的代码添加到视觉工作室而不进行单独的制作?