一个程序编译成Release 和 Debug,但是运行起来就会出现莫名其妙的问题, 有时是Release出问题,但Debug没事; 有时正好相反!大家谈谈针对这种情况,问题会出在那 以及 采取的解决方法? 
程序编写过程中应该注意什么,遵循什么原则?

解决方案 »

  1.   

    变量定义方式的不同在release和debug版本里面表现方式不一样,可以看看
    http://www.vckbase.net/document/viewdoc/?id=1312
      

  2.   

    FAQ里有好几个讨论帖,看看吧
      

  3.   

    ASSERT之类的宏在Release下是没用的
      

  4.   

    在_DEBUG宏内的代码应该不作任何有实际影响的操作的,应该只是一些调试信息打印等操作。应该是这个问题了。可以搜索一下所有的代码中的_DEBUG/ASSERT,查看其中的操作是否为有影响的操作。
      

  5.   

    Debug下用Assert宏
    Release下Verify宏继续有效
      

  6.   

    刚才看了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_MAP
    END_MESSAGE_MAP()//用以上MESSAGE_MAP实现用一个函数响应并处理多个 edit 的消息(ID 连续)
    这个是不是会产生问题,栈是不是会不平呀? 怎么修改一下呢?
    注:Debug版本没事
      

  7.   

    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=197453
      

  8.   

    是初始化的方式不对,debug模式写入了cch,即int 3,而release没有,按照老梁的办法,最好在release下调试。
      

  9.   

    还有一个问题:
    消息响应的函数原型到底是怎样的?afx_msg void OnMyMessage(UINT msg, LPARAM lParam, WPARAM wParam); 
    //消息响应函数定义是上面那种形式吗,,多出来的2个参数 LPARAM lParam, WPARAM wParam 怎么办?
    函数该怎么调用啊?
      

  10.   

    例如声明1个局部变量release中分配的空间
      sub esp,4
      
    debug中
      sub esp,44
    然后再将这44个字节用0xcc填充程序返回前回调用chesp检查多余的40个字节有没有被修改。
      

  11.   

    谢谢大家
    欢迎讨论 Release Debug 之各种区别以及应该注意的问题再问一句:
    手工添加的消息影射是下面这种形式吗
    afx_msg void OnMyMessage(UINT msg, LPARAM lParam, WPARAM wParam); 
    多出来的2个参数 LPARAM lParam, WPARAM wParam 怎么办?
    函数该怎么调用啊?