【发布时间】:2010-05-05 23:23:35
【问题描述】:
这太疯狂了。它开始在我的主项目中发生,所以我创建了一个小的示例全新项目来重现它,果然.. 它不会发生在我创建的只是一个 Win32 控制台应用程序的示例项目中。
我在 Win7x64 上运行它,如果这很重要的话。 VS2008 SP1。
来了。我创建了一个带有按钮的小对话框应用程序。在该按钮的处理函数中放置一个断点。按钮处理函数如下所示:
void CTestProjectDlg::OnBnClickedButton1()
{
int i;
i = 2; // < breakpoint here
i = 3;
}
点击按钮,点击断点。 F10 步进,然后繁荣:“TestProject.exe 中 0x0398f77b 的第一次机会异常:0xC0000005:访问冲突。”
它让我可以选择中断或继续。如果我继续,它只是再次击中它,而不是“第一次机会”。是的,我在 Debug->Exceptions dlg 中检查了该异常。
如果我中断,调用堆栈只会显示断点所在的行。如果我 F10 再次.. 我再次遇到异常,现在调用堆栈在 _AfxDispatchCmdMsg() 函数中显示我,而我原来的 OnBnClickedButton1() 不再在调用堆栈中。
我把断点放在哪里并不重要。
如果我不是按 F10,而是按 F5 继续,它可以正常工作。
现在..如果我构建一个发布版本并在调试模式下运行:我命中了断点,所有的指针、变量值看起来都很正常。 F10,这些变成垃圾。 this 指针现在为零。 m_csHello 现在是
但是,在 Release 模式下,没有捕获到异常,并且一切运行良好。 “hello World”字符串按原样显示在对话框中。
我已经询问过 IT 部门在过去一两天是否在我的盒子上安装了一些补丁。这不是 2 天前发生的。
你怎么看? VS2008是否损坏?
谢谢。
编辑:附加信息。如果我构建/调试 x64 平台,则不会发生这种情况。仅适用于 Win32。
我还查看了包装盒上 VS2008 的所有修补程序/安全更新。他们是
最后,我将项目放在了过去 2-3 周未更新的另一台机器上。它可以在那里找到,并且安装了这些相同的 VS 更新。
为了这篇文章的目的,我还更改了正在逐步执行的代码。 .. 这是一个简单的整数赋值,不涉及 MFC。
目前我正在重新安装 VS2008。
【问题讨论】:
-
您是否将控件(例如 IDC_BUTTON1)链接为 ON_BN_CLICKED(IDC2_BUTTON1, OnBnClcikedCutton1)?这可能是个问题。
-
是的。如果我理解你的问题,这就是它到达断点的方式。
-
在您的代码中,您必须在开始时将对话框的控制链接到相关函数:BEGIN_MESSAGE_MAP(CTestProjectDlg, CDialog) ... ON_BN_CLICKED(IDC2_BUTTON1, OnBnClcikedCutton1) “ON_BN_CLICKED”的 cpp 代码?有吗?
-
是的,它是:BEGIN_MESSAGE_MAP(CTestProjectDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON1, &CTestProjectDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BB END_MESSAGE_MAP() 顺便说一句。我尝试为 x64 平台构建/调试,并且能够在不发生这种情况的情况下逐步完成它。只有当我为 Win32 构建时。
标签: visual-studio-2008 mfc debugging access-violation