$$$$$$$$ Release Debug 之讨论!! 发分了!! 一个程序编译成Release 和 Debug,但是运行起来就会出现莫名其妙的问题, 有时是Release出问题,但Debug没事; 有时正好相反!大家谈谈针对这种情况,问题会出在那 以及 采取的解决方法? 程序编写过程中应该注意什么,遵循什么原则? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 变量定义方式的不同在release和debug版本里面表现方式不一样,可以看看http://www.vckbase.net/document/viewdoc/?id=1312 FAQ里有好几个讨论帖,看看吧 ASSERT之类的宏在Release下是没用的 在_DEBUG宏内的代码应该不作任何有实际影响的操作的,应该只是一些调试信息打印等操作。应该是这个问题了。可以搜索一下所有的代码中的_DEBUG/ASSERT,查看其中的操作是否为有影响的操作。 Debug下用Assert宏Release下Verify宏继续有效 刚才看了FAQ中的几个讨论,意识到我的Release版本可能会出现问题其最大可能就在我手工添加的消息上.如下: // Generated message map functions //{{AFX_MSG(CDialogAutoFill) afx_msg void EditSetFocusRang(UINT nID); afx_msg void EditKillFocusRang(UINT nID); afx_msg void EditChangeRang(UINT nID); //}}AFX_MSG DECLARE_MESSAGE_MAP()//nID:edit控件的 ID,作为参数BEGIN_MESSAGE_MAP(CDialogAutoFill, CDialog) //{{AFX_MSG_MAP(CDialogAutoFill) ON_CONTROL_RANGE(EN_SETFOCUS, IDC_EDIT_AUTOFILL, IDC_EDIT_AUTOFILL + MAX_EDIT_NUMBER - 1, EditSetFocusRang) ON_CONTROL_RANGE(EN_KILLFOCUS, IDC_EDIT_AUTOFILL, IDC_EDIT_AUTOFILL + MAX_EDIT_NUMBER - 1, EditKillFocusRang) ON_CONTROL_RANGE(EN_CHANGE, IDC_EDIT_AUTOFILL, IDC_EDIT_AUTOFILL + MAX_EDIT_NUMBER - 1, EditChangeRang) //}}AFX_MSG_MAPEND_MESSAGE_MAP()//用以上MESSAGE_MAP实现用一个函数响应并处理多个 edit 的消息(ID 连续)这个是不是会产生问题,栈是不是会不平呀? 怎么修改一下呢?注:Debug版本没事 http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=197453 是初始化的方式不对,debug模式写入了cch,即int 3,而release没有,按照老梁的办法,最好在release下调试。 还有一个问题:消息响应的函数原型到底是怎样的?afx_msg void OnMyMessage(UINT msg, LPARAM lParam, WPARAM wParam); //消息响应函数定义是上面那种形式吗,,多出来的2个参数 LPARAM lParam, WPARAM wParam 怎么办?函数该怎么调用啊? 例如声明1个局部变量release中分配的空间 sub esp,4 debug中 sub esp,44然后再将这44个字节用0xcc填充程序返回前回调用chesp检查多余的40个字节有没有被修改。 谢谢大家欢迎讨论 Release Debug 之各种区别以及应该注意的问题再问一句:手工添加的消息影射是下面这种形式吗afx_msg void OnMyMessage(UINT msg, LPARAM lParam, WPARAM wParam); 多出来的2个参数 LPARAM lParam, WPARAM wParam 怎么办?函数该怎么调用啊? 关于用Detours拦截API的求助 MFC Access数据库问题 关于vc中模板的问题 如何让动态创建的CStatic控制具有透明属性? RICHEDIT控件的使用 variant 变量的传递问题。 DLL 中怎么返回一个 CString 的值? 关于按钮的ICON设置和按下弹起的问题 为什么我运行到recv 就没有响应? UPDATE_COMMAND_UI为什么不起作用? 如何将.res链接到EXE文件中? 弹出式对话框里重载了PreTranslateMessage函数后,关闭该对话框时为何报错?
http://www.vckbase.net/document/viewdoc/?id=1312
Release下Verify宏继续有效
其最大可能就在我手工添加的消息上.
如下:
// Generated message map functions
//{{AFX_MSG(CDialogAutoFill)
afx_msg void EditSetFocusRang(UINT nID);
afx_msg void EditKillFocusRang(UINT nID);
afx_msg void EditChangeRang(UINT nID);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
//nID:edit控件的 ID,作为参数BEGIN_MESSAGE_MAP(CDialogAutoFill, CDialog)
//{{AFX_MSG_MAP(CDialogAutoFill)
ON_CONTROL_RANGE(EN_SETFOCUS, IDC_EDIT_AUTOFILL, IDC_EDIT_AUTOFILL + MAX_EDIT_NUMBER - 1, EditSetFocusRang)
ON_CONTROL_RANGE(EN_KILLFOCUS, IDC_EDIT_AUTOFILL, IDC_EDIT_AUTOFILL + MAX_EDIT_NUMBER - 1, EditKillFocusRang)
ON_CONTROL_RANGE(EN_CHANGE, IDC_EDIT_AUTOFILL, IDC_EDIT_AUTOFILL + MAX_EDIT_NUMBER - 1, EditChangeRang)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()//用以上MESSAGE_MAP实现用一个函数响应并处理多个 edit 的消息(ID 连续)
这个是不是会产生问题,栈是不是会不平呀? 怎么修改一下呢?
注:Debug版本没事
消息响应的函数原型到底是怎样的?afx_msg void OnMyMessage(UINT msg, LPARAM lParam, WPARAM wParam);
//消息响应函数定义是上面那种形式吗,,多出来的2个参数 LPARAM lParam, WPARAM wParam 怎么办?
函数该怎么调用啊?
sub esp,4
debug中
sub esp,44
然后再将这44个字节用0xcc填充程序返回前回调用chesp检查多余的40个字节有没有被修改。
欢迎讨论 Release Debug 之各种区别以及应该注意的问题再问一句:
手工添加的消息影射是下面这种形式吗
afx_msg void OnMyMessage(UINT msg, LPARAM lParam, WPARAM wParam);
多出来的2个参数 LPARAM lParam, WPARAM wParam 怎么办?
函数该怎么调用啊?