全局接口表 (GIT) 存储接口指针,以便可以跨单元安全地访问它们。在一个单元中添加的对象可以从 GIT 中移除,并且可以在另一个单元中访问。当接口被添加到 GIT 中的时候,将在 DWORD 中返回一个 Cookie。该 DWORD 需要存储在队列中,以便辅助线程可以简单地将该 DWORD 弹出队列,并且使用 GIT 提取与该 Cookie 相对应的 .NET 异常对象。
该异常的引发日期和时间也需要记录在队列中的元素内部。考虑以下情况:错误被引发,自定义的 SetErrorInfo 函数被调用,异常被添加到队列中,并且辅助线程被通知发布该异常。如果该辅助线程在一段时间内没有得到调度,则即使只过了几秒钟,其他异常也可能在第一个异常被实际发布之前被添加到队列中。因而,事件日志中实际记录的时间将与引发该错误的实际时间稍微不同步。因此,所记录的时间是至关重要的。所记录的时间和 .NET 异常 Cookie 将包装在结构内部,该结构将被添加到队列中。
因为 STL 队列类不是线程安全的,并且需要完成少量工作以便向队列中添加异常,所以创建了 ManagedExceptionQueue 类。这将使用类临界区来保护对队列进行的同时访问,将 GIT 的使用包装到该类上的 push 和 pop 函数中,并且为辅助线程和自定义挂钩函数提供了一个良好的接口,以便在队列中设置和检索异常信息。该过程显示在图 5 中。
图 5 两个通过 CCW 引发异常的客户端
在自定义 SetErrorInfo 函数将异常添加到队列中以后,就会在辅助线程内部产生一个事件,以通知它可以发布异常。队列类的代码存在于 MSDN Magazine Web 站点上的下载中的 ManagedExceptionQueue.cpp 中。
返回页首
异常日志记录线程
文章来源于领测软件测试网 https://www.ltesting.net/