【问题标题】:Consuming Windows NT Kernel System Call Trace Session Dumps使用 Windows NT 内核系统调用跟踪会话转储
【发布时间】:2012-03-14 23:54:02
【问题描述】:

我试图以某种方式记录(以编程方式或记录到日志文件)在给定时间跨度内选定数量的进程调用的每个系统调用。使用Is there something like linux ptrace syscall in Windows? 的答案,我已经能够正确地使用 ETW 来跟踪所有被调用到 etl 文件中的系统调用,然后我可以使用 tracerpt 将其转换为 XML 文件。然而,查看 XML 文件和其他可用格式,我发现了两个主要问题:

  1. 系统调用是根据调用的内存地址给出的,但我似乎找不到任何将这些地址转换为名称的好方法。作为参考,示例系统调用地址为 0xFFFFF80002AC22BC。

  2. 所有进程 ID 都设置为 0xFFFFFFFF,但似乎系统调用正在记录所有进程,而不仅仅是启动跟踪的进程。我应该如何确定哪个进程进行了哪个系统调用,或者至少过滤到我要跟踪的单个或选定数量的进程?

是否有人对上述问题有任何解决方案,或者更好的是,一些示例代码可能采用 tracerpt 可以输出的这些日志文件格式之一并将其转换为人类可读和可用的格式?

【问题讨论】:

    标签: windows system-calls


    【解决方案1】:

    所以我认为,环顾四周后,我已经能够以一种至少使其有用的方式解决这些问题(尽管很遗憾,由于其他问题对我没有用处)。

      1234563 to,并且可以手动直接映射到系统调用的名称,或者您可以使用可执行文件的符号表来查找名称。这些都没有经过我的测试,但似乎是在看后要走的路。
    1. 要查找是哪个进程在进行系统调用,当您浏览日志时,如果包含上下文切换信息,您就知道哪个进程在哪个内核上,并且每个系统调用都包括哪个内核系统调用正在发生,因此将为您提供准确调用系统调用的线程。

    【讨论】:

    • 嗨,戴夫。在CSwitch事件数据中,可以获取新旧线程id,但是我在哪里可以获取进程id呢?
    【解决方案2】:

    (1) 每次重新启动系统时,内核跟踪器列出的包含内核系统函数的库不会加载到相同的位置。使用内核调试器解析系统调用地址的一种方法。例如ln <address> 将在<address> 处为您提供函数的名称。如果您在多次重启后在内核中键入lm,您会注意到模块“nt”始终位于不同的位置。

    (2) 根据我的阅读,您对必须跟踪上下文切换是正确的,但我从未真正尝试过这样做。

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 2011-08-02
      • 2014-03-20
      • 2012-04-03
      • 2011-04-20
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多