代码之家  ›  专栏  ›  技术社区  ›  Mikhail

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

  •  3
  • Mikhail  · 技术社区  · 16 年前

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

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

    int* i = 0;
    *i = 4;
    

    *i = 4; ,控件返回到主应用程序窗口,程序继续执行,因为没有发生任何事情!如果代码中没有错误,则执行良好。但我希望在这种情况下可以断言错误!它们在主应用程序的代码中。

    4 回复  |  直到 16 年前
        1
  •  1
  •   Remus Rusanu    16 年前

    很可能是从错误的位置加载带有LoadLibrary()的DLL,并且缺少PDB会阻止调试器设置断点。您也可以在禁用断言的情况下加载零售DLL(如果“要断言的错误”表示您在代码中有断言)。如果错误是页面错误(如示例中显示的AV),并且调试器没有中断,则表示已处理异常。你总是可以一有机会就开始休息。 sxe av . 不确定如何从代码编辑工具执行此操作,但始终可以使用 real debugger

        2
  •  1
  •   Hans Passant    16 年前

    在代码库中的某个地方有一个异常处理程序正在吞噬异常。首先查找SetUnhandledExceptionFilter。另外:调试+异常、Win32异常,勾选抛出复选框。

        3
  •  0
  •   Mikhail    16 年前

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

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

    违反写入位置0x00000000。

    0x00a3a83e处的首次机会异常 在dmc.exe中:0xC0000005:访问

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

    但在第二种情况下(在OnBnClickedButton1()内部),不会引发异常,OnBnClickedButton1()的执行将中止,程序将继续正常运行。在输出窗口中跟踪以下消息:

    0x00a3c23f处的首次机会异常 在dmc.exe中:0xC0000005:访问

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

    很抱歉,问题的第一个版本出现错误。

        4
  •  0
  •   Community Mohan Dere    9 年前

    哦,原来这个问题是由OpenGL引起的 wglMakeCurrent() 仅在Windows 7 64位下使用NVIDIA GeForce 8800图形卡时才可拨打电话,同时在Windows Vista 32位下一切正常。

    here