《Windows驱动开发技术详解》一书中,介绍了一种“Windows驱动程序日志打印和查看的方法”,具体就是:在需要打印日志的地方,调用“KdPrint”函数,该函数类似标准C的printf(print file)函数。然后用“DebugView.exe”软件查看日志。
一、引入
事实上,微软也提供了一个日志打印和日志查看机制,它可以查看指定的驱动文件的日志,并根据“Level”和“Flag”进行日志过滤,也可以保存成文件。这套机制就是“WPP”和“TraceView.exe”。
随便打开一份微软提供的驱动示例代码,如:PLX9x5x,都会看到它里面有WPP。
在WDF框架中,有一个“trace.h”头文件,在驱动的入口函数中,会用到
// Initialize WDF WPP tracing.
WPP_INIT_TRACING( DriverObject, RegistryPath );
//
// TraceEvents function is mapped to DoTraceMessage provided by
// WPP by using a directive in the sources file.
//
TraceEvents(TRACE_LEVEL_INFORMATION, DBG_INIT, "Pci9656 Sample - Driver Framework Edition.");
此外在驱动中大量用到“TraceEvents”,取代之前的“KdPrint”,用于打印日志信息。
二、使用
WPP的使用比较简单,WDF的框架代码已将将它初始化好了,我们只需在用到的地方,调用“TraceEvent” 即可。其中,“TraceEvent”的前两个参数分别指定“Level”和“Flag”。
然后,在安装了VS2015的PC上,“开始”->“Windows Kits”->“Windows Software Development Kits”,打开一个文件夹,再在其中的“Tools->X64”目录下找到“TraceView.exe”。
安装它的说明书操作,先“创建一个新的会话”。
然后“Add Provider”,并选择你驱动文件的“.pdb”文件即可。
创建好后,使用应用程序调驱动进行测试,有时会发现traceview中没有反应。这是因为,默认的“Level”设置的是“Error”级别,你需要重新设置,比如设为“Infomation”级别。这个设置的“Level”表示的是最低过滤级。