使用调试器和 Logexts.dll

激活记录器的一种方法是像往常一样启动 CDB 或 WinDbg 并附加到用户模式目标应用程序。 然后,使用 !logexts.logi!logexts.loge 扩展命令。

此操作会在当前断点处插入代码,而该断点将跳转到在目标应用程序进程中用于加载和初始化 Logexts.dll 的例程。 这称为“将 Logger 注入目标应用程序”。

实际上会运行两个 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 模块,因为不允许记录器自行记录。