【问题标题】:Show pointer value in kernel printouts (instead of <ptr>) on parallels VM that runs OS X 10.12在运行 OS X 10.12 的并行 VM 上的内核打印输出中显示指针值(而不是 <ptr>)
【发布时间】:2017-10-20 17:15:21
【问题描述】:

我正在开发一个在 10.12.4 VM 下运行的 Kext(我使用并行),我想启用指针打印输出(目前所有指针都被隐藏并在 /var/log/system.log 上显示为 &lt;ptr&gt;

在 10.12 之前,可以通过设置 nvram csr-active-config=%ff%00%00%00 来直接取消调试限制。但是,现在无法直接设置csr-active-config,而是通过恢复模式下的csrutil disable。不幸的是,它并没有禁用所有 SIP 功能,并且指针仍然隐藏。

幸运的是,以下thread 提供了解决方法:

或者,可以通过设置 csr-active-config=ff%00%00%00 完全禁用 CSR。对于 VM,这可以通过引导到恢复分区、运行 csrutil clear 以完全删除 csr-active-config 变量和 nvram Xsr-active-config=ff%00%00%00 来实现。然后关闭 VM,并使用十六进制编辑器更改 nvram 文件中的 X -> c。这将允许 -show_pointers 引导参数工作。

我正在使用 Parallels,并尝试查找 nvram 设置的位置。我看到了名为NVRAM.dat 的有前途的文件,但不幸的是 在按照上面引用段落中的说明进行操作后,我无法跟踪字符串 Xsr-active-config

也许 nvram 设置还有其他地方?

谢谢

【问题讨论】:

    标签: c macos kernel virtual-machine xnu


    【解决方案1】:

    在调试器中将 doprnt_hide_pointers 更改为 false

    【讨论】:

    • 很好,我不知道这个全局...我确实想知道恐慌如何正确显示指针,而其他所有方法都隐藏它..
    【解决方案2】:

    我没有直接回答您的问题,但我有一个解决方法:kprintf() 串行日志的输出是 指针清理的。因此,如果您在调试引导参数中启用 kprintf 标志,激活一个虚拟串行端口,该端口将写入 VM 设置中的主机文件并将您的日志记录从 printf/IOLog 更改为 kprintf,您可以获得原始记录到您的串行端口文件。

    我发现kprintf() 日志记录机制在其他方面也比内核 syslog 更有帮助——它可以在紧急情况下工作,它没有速率限制,而且噪音更小。缺点是,如果您记录大量日志,它会对性能产生显着影响。

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 2017-02-14
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2019-04-25
      相关资源
      最近更新 更多