Fortran Coder

标题: 关于access violation [打印本页]

作者: andy8496    时间: 2020-2-27 23:42
标题: 关于access violation
本帖最后由 andy8496 于 2020-2-27 23:44 编辑

调试一个程序,结果已经正确输出,但是在最后一步,弹出如图1所示提示,黑框没有任何内容。
这时候如果点继续,则出现图3所示窗口,确定后继续显示图1,除非点中断,否则一直显示图3.

换成release的程序,则一直显示图3,点击确定循环出现,除非从任务管理器中结束它。
代码很长,输入的数据量也很大,是一个Program中调用dll,都是自己编写的Fortran程序,
调试时两部分也都是用的debug,一步步跟进去也没啥问题,release运行时两部分也都是用的release。
不知何故,实在很苦恼。
我理解是程序中有些不太严重的错误,在有错误的位置没有及时提示,而是等到最后程序要退出的时候秋后算账。

有没有一种调试方法能找出程序的问题出在哪儿?
或者最不济,有没有什么方法让我在Release时最后能跳过这个错误,毕竟结果已经有了。


3.png (18.32 KB, 下载次数: 270)

3.png

2.png (28.5 KB, 下载次数: 282)

2.png

1.png (25.67 KB, 下载次数: 282)

1.png

作者: necrohan    时间: 2020-2-28 16:37
一步步跟进去也没啥问题?那怎么出的错误
作者: andy8496    时间: 2020-2-28 17:24
necrohan 发表于 2020-2-28 16:37
一步步跟进去也没啥问题?那怎么出的错误

对,结果也跟预期一样,用的VS+IVF,能打开的检查项也都打开了
一直到end program的位置停下来出错了
作者: fcode    时间: 2020-3-1 09:02
这极可能是堆栈失衡了。
检查一下对程序的调用,特别是第三方函数库或混编的函数调用。
还有可能是主程序里有个数据结构(数组或结构体),传递给子程序的时候,子程序误以为大小比真实的大,所以操作(修改)了超过范围的该数据结构内容。

你说的“秋后算账”,这事还真的是有的。函数返回(包括主程序返回)的时候,会进行堆栈还原等操作。如果此时堆栈失衡,就会出问题。
比如程序准备返回主程序之外(运行时库)的返回点,但是这个返回点原来是存储在堆栈里的,失衡以后被破坏,导致返回失败。(比如要返回 0x00000000就会失败)

作者: jojo9    时间: 2021-9-14 16:26
我也碰到这奇怪的东西了,输出都是没问题。。编译也没报错
作者: jojo9    时间: 2021-9-14 16:28
还报了“其原因可能是堆被损坏,这说明 foamtogo.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 foamtogo.exe 具有焦点时按下了 F12。”




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2