我做了一个应用程序,编译为Debug版本后,运行程序,关闭也正常结束。但我将它编译为Release版本后,运行程序还很正常,但关闭程序就出错,弹出如下的对话框        错误签名
             AppName: mairay.exe       AppVer:1.0.0.1               ModName: mfc42.dll
             ModVer:6.2.4131.0         Offset: 00001ad4真是莫名其妙,有哪位高手碰到过类似问题或了解这方面的问题帮忙解决一下,先谢了。

解决方案 »

  1.   

    这种现象见多了。
    DEBUG下会有一些安全机制,自动帮你完善。Release下不会有这种安全机制,所以容易出问题。检查一下析购函数之类的代码,是否严谨。
      

  2.   

    先检查代码,然后
    拿工具windbg运行一下,看看是在哪出的错。
    或者,
    在代码中打印日志看一下在哪出的错也行。
      

  3.   

    这个正解,真正的软件是用Release版本的.
    Release下很多问题都暴露出来了
      

  4.   

    谢谢各位,但是我用5楼说的方法在代码中打印日志,结果是主窗口响应了WM_CLOSE和VIEW响应了WM_DESTROY消息,其他的子窗口,文档类及APP都没有执行他们的退出代码头疼啊,
      

  5.   

    如果release有问题,debug下仔细跟踪也会有问题。现在条件已经很明确了,就是退出时出错,这应该很好调试的。
      

  6.   

    生成pdb符号文件,然后用windbg运行程序
      

  7.   

    那应该是程序逻辑的问题,要补充完整功能。
    在DEBUG下运行,要注意查看编译器的输出,如果没有设置异常引发时stop alawys,(可以在调试状态下,到菜单debug->exceptions中设置EXCEPTION的中断),一般的异常都通过这里输出了。补充完退出的代码后,如果还是引发异常,建议还是生成pdb文件(工程设置中,生成调试符号),使用windbg运行一下吧,windbg是显示当时的线程、堆栈、寄存器等完整的现场信息。
      

  8.   

    这么复杂,没用过windbg,这下可难倒了
      

  9.   

    在你对象释放的地方多加些判断吧...比如释放指针 
    #define safedel(p) {if(p!=NULL){ delete p;p=NULL;}}之类的
      

  10.   

    2个dll,不防设为DllA和DllB,其中DllA要用到DllB,而主程序不妨叫它Main也要用到DllB,DllA编译Release版本时如果用DllB的Debug版本,而Main在编译时用的是DllB的Release版本,最后Main用将DllA的Release版本链接进来,那么在程序运行时会不会出现上述我提出的问题呢?
      

  11.   

    程序退出时没有在OnClose里面进行“善后处理”?
      

  12.   


    怎么搞这么复杂呢?release中用debug的dll。到微软网站下载一个windbg,在windbg里运行你的EXE 或 先运行你的EXE再用windbg附加到该进程,g一下,然后进行出异常的操作,windbg会显示详细的现场信息,你的程序应该不复杂,十有八九可以找到直接出错点,再根据出错点的逻辑判断大致问题在哪。
      

  13.   

    你看看在debug下你的程序又没有内存泄露,在仔细检查退出时的释放内存的那些代码,
    看看有没有进行异常处理。
      

  14.   

    windbg是必备的工具,借这个机会,接触一下不是坏事。
      

  15.   

    其实,碰到这样问题的时候,通常就是立即重建一个project,看看会不会出错,不出错,肯定是程序问题。
    然后在新project中逐个加入那些文件及代码,一个个的加,看看到底哪里出问题。一般半个小时内就能定位问题的。
    即使再大的项目,也不是一口气写完的,总归是一步一步来的,不可能全写完了才编译一次的吧。
      

  16.   

    这种情况不太好判断
    如果出现debug和release执行结果有问题的话
    一般可以针对指针和变量的“初始化”以及“释放”做一些查找
      

  17.   

    谢谢各位的关注,我的程序是一个SDI应用程序,然后增加了几个无模式对话框,这2天在各个窗口的关闭函数或销毁函数里加上TRACE语句后,注意到这些函数都没有被调用,有个警告是“Warning: calling DestroyWindow in CDialog::~CDialog -- OnDestroy or PostNcDestroy in derived class will not be called.”就是说程序退出时这些释放指针的函数OnDestroy没被调用,从这点出发对程序加以修改,最后OK啦。