我们正在发送一个shell扩展dll(在regsvr32中注册)。 是否有一种简单的方法可以从另一个应用程序从此dll获取调试输出(因此我们可以在某些内容被破坏时将这些跟踪发送回家)?
任何想法?什么是从dll到另一个进程的logdata最简单的方法?
答案 0 :(得分:1)
如果它是一个shell扩展DLL,那么它不是作为登录用户运行的,因此它不能写入磁盘上某个合适目录中的日志文件吗?如果是这样,那么为什么你要它写入另一个进程?
答案 1 :(得分:0)
您可以使用Event Tracing for Windows (ETW)来跟踪扩展DLL的执行情况。当没有监听器处于活动状态时ETW几乎没有开销,所以在正常情况下你的DLL不会产生性能损失;同时它允许在不同级别的细节上进行详细输出。
ETW的工作方式是调用API时,它们会检查是否有一个侦听器订阅了来自特定发布者的跟踪,如果没有,则不会生成任何内容。如果存在侦听器,则只将侦听器订阅的跟踪写入内存映射文件。因此,只有按要求生成跟踪数据。
可以随时激活ETW侦听器,并且不必重新启动发布者。此外,ETW不受味道限制,可用于调试和零售。因此,如果您的客户遇到问题,您只需向听众发送如何运行并收集信息的说明;您不必向他们发送一个检测二进制版本。您可以编写自己的应用程序作为侦听器,也可以使用标准tracelog.exe和tracefmt.exe工具将跟踪写入文件。
要在DLL中生成必要的ETW代码,您可以使用WPP preprocesor而不是直接使用ETW API。
注意:虽然我在这里发布的所有链接都是Windows Driver Kit文档,但ETW和WPP可以(并且大量)用于常规用户模式程序。