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

时间:2012-05-22 14:58:52

标签: c++ c visual-studio-2010 debugging

我已经使用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

我想知道这是否可能是由于转换后的C(来自Fortran)文件中的f2c转换器所做的“更正”:

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

这看起来有点奇怪,因为所有这些变量都是C数组,我认为f2c程序只是做一些指针运算,因此数组中的索引0变为索引1,与Fortran类似。

我不知道这是否也可能是因为转换后的代码访问了尚未分配的数组元素的问题。

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

3 个答案:

答案 0 :(得分:1)

潜在原因:

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

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

答案 1 :(得分:1)

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

这样的东西
int aa[10];
int *pa = aa;
--pa;
pa[1] = ...

即,以小规模测试可疑代码。您可以通过这种方式将原因与问题隔离开来。 (找到一种解决方法是另一回事)

答案 2 :(得分:1)

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

另外,您的库是否可以构建为C并且您的应用程序是用C ++编写的?

您提到的那些错误有时是因为不同的调用约定。你说它是一个64位应用程序,所以它不应该是一个问题(所有64位应用程序使用相同的调用约定),但它值得研究。

是否可以将所有fortran转换后的代码添加到visual studio而不是单独制作?