使用调试器和 Logexts.dll
激活记录器的方法之一是启动 CDB 或 WinDbg,并像往常一样附加到用户模式目标应用程序。 然后,使用 !logexts.logi 或 !logexts.loge 扩展命令。
这会在当前断点处插入代码,该断点将跳到在目标应用程序进程中加载和初始化 Logexts.dll 的例程。 这称为“将记录器注入目标应用程序”。
实际上,Logexts.dll 有两个实例在运行,因为此模块既是调试器扩展 DLL,又是注入目标应用程序的程序。 Logexts.dll 的调试器和目标实例通过内存的共享部分进行通信,该部分包括输出文件句柄、当前类别掩码和指向日志输出缓冲区的指针。
附加到目标应用程序
有关将调试器附加到目标应用程序的信息,请参阅 使用 WinDbg 调试 User-Mode 进程 或使用 CDB 调试 User-Mode 进程。
使用记录器扩展命令
有关每个扩展的完整语法,请参阅其参考页。
!logexts.logi
将 Logger 注入目标应用程序。 这会初始化日志记录,但不启用它。
!logexts.loge
启用日志记录。 如果未使用 !logexts.logi ,则此扩展将初始化并启用日志记录。
!logexts.logd
禁用日志记录。 这将导致删除所有 API 挂钩,以允许程序自由运行。 不会删除 COM 挂钩,因为无法随时重新启用它们。
!logexts.logo
显示或修改输出选项。 可以有三种类型的输出:直接发送到调试器的消息、文本文件或 .lgv 文件。 .lgv 文件包含的信息比其他两个文件多得多;可以使用 LogViewer 读取它。
如果禁用文本文件输出,仍会创建大小为零的 .txt 文件。 这可能会覆盖同一位置中以前保存的文本文件。
!logexts.logc
显示可用的 API 类别,控制哪些类别将被记录,哪些将不记录,并显示包含在任何类别中的 API。
如果禁用某个类别,则将删除该类别中所有 API 的挂钩,以便不再有任何性能开销。 不会删除 COM 挂钩,因为无法随时重新启用它们。
仅当仅对程序与 Windows 进行的特定类型的交互(例如文件操作)感兴趣时,仅启用某些类别会很有用。 这可减小日志文件大小,并降低记录器对进程执行速度的影响。
!logexts.logb
显示或刷新当前输出缓冲区。 作为性能考虑,仅当输出缓冲区已满时,日志输出才会刷新到磁盘。 默认情况下,缓冲区为 2144 字节。
由于缓冲区内存由目标应用程序管理,因此,如果目标应用程序中存在访问冲突或其他一些不可恢复的错误,则不会自动将缓冲区写入磁盘上的日志文件。 在这种情况下,应使用此命令手动将缓冲区刷新到磁盘,否则最近记录的 API 可能不会显示在日志文件中。
!logexts.logm
显示或创建模块包含/排除列表。 通常最好只记录从特定模块或模块集进行的那些 API 调用。 为了方便实现此目标,Logger 允许指定模块包含列表,或者指定模块排除列表。 例如,如果只想记录来自一个或两个模块的调用,则使用包含列表。 如果要记录除模块的简短列表之外的所有模块发出的调用,可以使用排除列表。 始终排除 Logexts.dll 和 Kernel32.dll 的模块,因为不允许记录器自行记录。