首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

调试的时候选择release 正常,选择debug崩溃,该怎么解决

2012-04-28 
调试的时候选择release 正常,选择debug崩溃直接运行 release那个exe一切正常,用release调试也一起正常。如

调试的时候选择release 正常,选择debug崩溃
直接运行 release那个exe一切正常,用release调试也一起正常。
如果运行dubug文件夹的exe,就出现错误



debug调试的时候出现如下错误










[解决办法]
看不到图,不过在debug下跟一下应该就可以找到问题所在了
[解决办法]

如果运行dubug文件夹的exe,就出现错误


debug调试的时候出现如下错误








[解决办法]
贴代码吧
[解决办法]
从main函数开始,加个断点,单步调试,看看是在哪里崩掉的。
[解决办法]
引发断言了,调试呀,看看什么无效了,表达式不成立了。
[解决办法]
从提示的错误看是你使用了fscanf这样的函数传递的FILE*为NULL
[解决办法]
一般情况下debug 与release区别如下 
1. 变量。 
大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc, 而release的赋值近似于随机。如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其 初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到。debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了。 
2. 自定义消息的消息参数。 
MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。这也存在debug跟release的问 题吗?答案是肯定的。在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn(); Debug 情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消息体的参数 没有添加,即应该写 成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); 3. release模式下不出错,但debug模式下报错。 
这种情况下大多也是因为代码书写不正确引起的,查看MFC 的源码,可以发现好多ASSERT的语句(断言),这个宏只是在debug模式下才有效,那么就清楚了,release版不报错是忽略了错误而不是没有错误,这可能存在很大的隐患,因为是Debug模式下,比较方便调试,好好的检查自己的代码,再此就不多说了。 
3. ASSERT, VERIFY, TRACE.......... 调试宏 
这种情况很容易解释。举个例子:请在VC下输入ASSERT然后选中按F12跳到宏定义的地方,这里你就能够发现Debug中 ASSERT要执行AfxAssertFailedLine,而Release下的宏定义却为\"#define ASSERT(f) ((void)0)\"。所以注意在这些调试宏的语句不要用程序相关变量如i++写操作的语句。 
VERIFY 是个例外,\"#define VERIFY(f) ((void)(f))\",即执行。 


详细见 http://javafans.iteye.com/blog/609937

[解决办法]

探讨
代码本身应该没有逻辑错误,不然release不可能正常运行。

[解决办法]
void CTermSrvView::OnInitInstance()
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

ASSERT(CFormView::CreateWindow()); //这样写,Release下会出错,Debug正常
CFormView::OnInitInstance();
}
[解决办法]
第一个回复,贴的代码丢失了,补上第二个回复,其实说的与第一个差不多
[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

[解决办法]
探讨

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

热点排行