2010-01-28 62 views
3

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

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

int* i = 0; 
*i = 4; 

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

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

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

回答

0

哦,事实证明,这个问题是由OpenGL wglMakeCurrent()调用引起的,只有在使用NVIDIA GeForce 8800图形卡的Windows 7 64位版本下才会出现,同时在Windows Vista 32位版本下,所有这些都可以正常工作。

我问了一个新问题here。感谢您的反馈意见。

1

很有可能你是从一个不正确的位置加载LoadLibrary()的DLL,并且缺少PDB会阻止调试器设置中断点。您也可以加载断言Asserts的零售DLL(如果'错误被断言',你的意思是你有代码中的ASSERT)。如果错误是页面错误(如您在示例中显示的AV)并且调试程序没有中断,则意味着该异常已处理。你可以随时开启休息,例如。 sxe av。不知道你是如何从代码编辑工具中做到这一点的,但你总是可以使用real debugger

1

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

0

哦,好像这个bug根本就和DLL没有关系。调试器在主应用程序模块中的行为也是相同的。我已经将这段代码片段插入到OnInitDialog()函数中,并按钮单击OnBnClickedButton1()处理函数。

在第一种情况下(当在OnInitDialog()内部时),像往常一样引发异常,程序无法从此错误中恢复。下面的消息被跟踪输出窗口:在dmc.exe在0x00a3a83e

第一次机会异常:0000005:访问 冲突写入位置00000000。

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

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

但是在第二种情况下(当内部OnBnClickedButton1())不会抛出异常,OnBnClickedButton1的执行()被中止,程序继续正常运行。下面的消息被跟踪输出窗口:在dmc.exe在0x00a3c23f

第一次机会异常:0000005:访问 冲突写入位置00000000。

所以看起来应用程序初始化后出现了一些顶级异常处理程序。我已经创建了新的测试应用程序,并尝试使用它,在这两种情况下都会引发异常。我已经比较了他们的项目设置(比较.vcproj文件),并发现没有与此问题相关的差异。

也许这种行为是由一些奇怪的MFC宏定义控制的?还是我无意中受到其他一些设置的影响?

对不起,在第一个版本的问题。