求助:调试运行正常通过,直接运行exe报错

nyalathotep 2012-07-23 10:47:28
用opencv写了个人脸识别的程序
在vs2008下调试运行debug和release都没有问题,并且也输出了正确的结果到硬盘
但是运行debug和release文件夹下的exe程序就会报错
“应用程序发生异常 unkown software exception (0x40000015),位置0x7857bb47”
以前都没遇到过这种情况,求助各位前辈
...全文
434 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsxyhelu 2014-09-08
  • 打赏
  • 举报
回复
请教一下,这个问题解决了没有? 我现在的问题也是opencv编程时,调试正确,运行的时候会内存溢出。不知道和你这个是否是一个问题。 问题描述: 封装opencv的函数,形成自己的dll文件,GOImage.dll.并且以函数的形式开放接口。在该函数中,主要是对读取的一系列图片数据进行特征识别、对准、融合操作。最终此dll以非托管的形式被 csharp程序调用,输入待拼接的图片地址,并在指定的位置生成结果图片。 在vs环境下进行调试(F5),无论debug还是 release模式,都可以正常运行,没有问题。然而单独运行程序的过程中(ctrl +F5),则会发生内存不断增大的现象。为了方便说明问题,我重新生成一个简单的函数,该函数的唯一作用就是读取图片到vector组中。 DllExport int imageprocesstest( char *cur_dir,char *imagepath_res, int isstraighten) { char DllBuff[50]; vector<Mat> inputmat; Mat src; for (int i = 1;i<=12;i++) //执行D全?部?文?件t的?遍历 { if (i<10) { sprintf(DllBuff, "%s\\image00000%d.jpg" ,cur_dir,i); } else { sprintf(DllBuff, "%s\\image0000%d.jpg" ,cur_dir,i); } src= cv::imread(DllBuff,CV_LOAD_IMAGE_COLOR); if (!src.data) { inputmat.clear(); return 1; } inputmat.push_back(src); //将?读取?的?结果?压1入?inutmat } vector<Mat> (inputmat).swap(inputmat); return 0; } 及时对于此函数,也会存在上面一样的情况,同时在vs中以F5调试的时候,不会出现内存溢出(每隔一段时间vs会自动清除内存),而以ctrl+F5的模式则会出现溢出的情况 为了解决这个问题,我做了很多摸索。比较靠谱的是两条线路,一条是从csharp调用这个方面来考虑,为什么在F5的模式下能够成功调用,至少说明有一种模式能够解决这个问题(我认为有可能是和appdomin相关的,具体的需要继续去查一查F5和ctrl +F5的区别)我探索过的方法包括动态绑定、销毁;dymanticmethod;生成clr类;已经实现idisable接口等;另一条思路是从dll文件那个部分考虑的,即如何以在dll中就将对象销毁掉,其中比较有突破性的是vector的swap方法。 但是以上的方法都不能很好地解决现有问题。到目前为止,唯一看到的正确执行的就是vs的ctrl F5。
nyalathotep 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
那就是你的代码写的有问题了,极大的可能是变量没有初始化,因为在调试器下会被自动初始化的。
[/Quote]
我在每个函数前面加入了输出的语句,找到了报错的函数void flannFindPairs(),是opencv自带的surf算法的函数应该不会有错。然后我输出了所有的输入参数都有值,并且在出错的代码段输出了一些变量的值,还没发现问题。
准备按照7楼的办法检查一下内存什么的。
多谢楼上两位,我先去调一下,回头再请教两位
zhanshen2891 2012-07-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
调试目录就是exe所在目录
刚才试了一下删了exe目录下一个dll文件,调试报错找不到文件,放回去调试正常了
但是exe还是运行不了
[/Quote]

那就是你的代码写的有问题了,极大的可能是变量没有初始化,因为在调试器下会被自动初始化的。
zgl7903 2012-07-24
  • 打赏
  • 举报
回复
0x7857bb47 位置应该是某个动态库地址,
Release版调试模式启动,正常启动完了 暂停程序,可以在模块窗口中看到加载的地址段情况,如果加载符号,还可以在反汇编窗口地址中填入0x7857bb47,看是哪个模块的哪个函数报错,重点在程序中检查用到此函数的程序段,当然有些函数是间接被调用的,因此可以设置断点,继续运行操作程序,停下来的时候可以看看调用堆栈,这样比较容易确定问题点
taotaoma456 2012-07-23
  • 打赏
  • 举报
回复
我也没遇到过,我来看答案的
nyalathotep 2012-07-23
  • 打赏
  • 举报
回复
调试目录就是exe所在目录
刚才试了一下删了exe目录下一个dll文件,调试报错找不到文件,放回去调试正常了
但是exe还是运行不了
zhanshen2891 2012-07-23
  • 打赏
  • 举报
回复
看一下你的exe是不是依赖了什么文件?你检查一下调试目录,看看是在你exe所在的目录么,如果不在把exe放到调试目录下试试
nyalathotep 2012-07-23
  • 打赏
  • 举报
回复
opencv的环境变量配置了的,其他基于opencv写的代码都可以正常运行
刚才把所有opencv的dll放到exe文件目录下试了一下还是报同样的错
lslsyqyq 2012-07-23
  • 打赏
  • 举报
回复
opencv的各种dll有没有设置环境变量path?

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧