zoukankan      html  css  js  c++  java
  • c#/C++混合编程的一个问题

    有一天,我在调试一个问题,在一个进程上弹出一个Waston对话框。让我吃惊的是,在Waston触发的堆栈上,有一个带有Testcatch(…)块的非托管C++函数。据我理解,此块应该捕获Windows中抛出的任何用户模式异常,包括来自RaiseExceptionr调用(例如,C++异常)、AV、堆栈溢出等的异常。为什么异常会逃出这样的块而变得未处理?我发现异常是调试中断。在X86中,它由操作码0xCC或“int3”触发。当我调试到VCRT的EH代码时,我发现catch(…)故意让调试中断。它确实有意义:debug break是为了停止调试器,因此源代码不应该处理它。我只是从来没有意识到。
    另一个有趣的部分是这个调试中断的来源,进程的代码从不调用DebugBreak。在我调试了更多之后,问题就出在一个过早的GC问题。托管代码向非托管代码传递了委托,但未通知GC延长其生存期。当非托管代码调用回调时,托管委托对象已被收集,因此非托管代码被调用到垃圾内存中。内存正好被0xCC填满,所以当进程试图执行这段代码时,它触发了int3,然后Waston启动了。
  • 相关阅读:
    纯win32实现PNG图片透明窗体
    win32用GDI+加载png图片作为背景图
    vc 制作图片资源dll
    wav文件格式分析详解
    VC++ WIN32 sdk实现按钮自绘详解.
    PNG文件结构分析 ---Png解析
    vc/mfc获取rgb图像数据后动态显示及保存图片的方法
    ffmpeg解码流程
    移植ffmpeg到VC环境心得
    Java
  • 原文地址:https://www.cnblogs.com/yilang/p/13501416.html
Copyright © 2011-2022 走看看