调试器忽略动态加载的DLL中的错误

时间:2010-01-28 17:58:13

标签: c++ dll visual-studio-2005 mfc debugging

我有一个与调试自编码DLL有关的非常奇怪的问题。我有一个MFC驱动的基于对话框的应用程序,静态链接的几个项目和运行时加载的几个DLL项目。

我在调试中构建解决方案,运行应用程序,我可以轻松地调试这些DLL项目。现在问题。如果DLL中有一些明显的运行时错误,如下面的

int* i = 0;
*i = 4;

调试器断言没有错误,不抛出异常并静默返回空闲状态,甚至没有(可见)堆栈返回。看起来当我在语句*i = 4;上点击F10时,控件返回到主应用程序窗口,程序执行继续,因为什么都没发生!如果代码中没有错误,则执行正常。但我希望在这种情况下可以断言错误!它们是 - 在主应用程序的代码中。

我使用LoadLibrary()函数将我的DLL加载到应用程序中。 DLL本身具有静态链接的MFC,与解决方案中的其他项目一样。

有什么想法吗?甚至不知道谷歌的问题......

4 个答案:

答案 0 :(得分:1)

您很可能从不正确的位置使用LoadLibrary()加载DLL,并且缺少PDB会阻止调试器设置断点。您也可以加载禁用Asserts的零售DLL(如果'要声明'错误',则表示您在代码中有ASSERT)。如果错误是页面错误(如您在示例中显示的AV)并且调试器没有中断,则意味着处理了异常。你总是可以在第一次机会时开启休息时间,例如。 sxe av。不确定如何使用代码编辑工具执行此操作,但始终可以使用real debugger

答案 1 :(得分:1)

您的代码库中有一个异常处理程序正在吞噬异常。首先查找SetUnhandledExceptionFilter。另外:Debug + Exceptions,Win32 Exceptions,勾选Thrown复选框。

答案 2 :(得分:0)

哦,似乎这个bug根本与DLL无关。调试器在主应用程序模块中的行为方式也相同。我已将此代码片段插入OnInitDialog()函数并按下按钮单击OnBnClickedButton1()处理函数。

在第一种情况下(当在OnInitDialog()内部时),像往常一样抛出异常,程序无法从此错误中恢复。在输出窗口中跟踪以下消息:

  

0x00a3a83e处的第一次机会异常   在dmc.exe中:0xC0000005:访问   违规写入位置0x00000000。

     

0x00a3a83e处的第一次机会异常   在dmc.exe中:0xC0000005:访问   违规写入位置0x00000000。

     

0x00a3a83e处的未处理异常   dmc.exe:0xC0000005:访问冲突   写入位置0x00000000。

但是在第二种情况下(当在OnBnClickedButton1()内部时)没有抛出异常,OnBnClickedButton1()的执行被中止并且程序继续正常运行。在输出窗口中跟踪以下消息:

  

0x00a3c23f处的第一次机会异常   在dmc.exe中:0xC0000005:访问   违规写入位置0x00000000。

因此,在初始化应用程序之后,似乎会出现一些顶级异常处理程序。我已经创建了新的测试应用程序并尝试了同样的事情 - 在这两种情况下抛出异常。我已经比较了他们的项目设置(差异在.vcproj文件上),发现没有与此问题相关的差异。

也许这种行为是由一些奇怪的MFC宏定义控制的?或者我是否因其他一些设置无意中影响了它?

抱歉第一版问题出错。

答案 3 :(得分:0)

哦,事实证明这个问题是由OpenGL wglMakeCurrent()调用造成的,并且仅在使用NVIDIA GeForce 8800显卡的Windows 7 64位下体验,同时在Windows Vista 32位下一切正常。

我问了新问题here。感谢您的反馈。