低级内核开发
在内核开发中,需要监控或破坏内核是很常见的情况 在 gfxconsole 显示之前
要在 x64 机器上强制启用日志输出到旧版串行控制台,请将 "kernel.serial=legacy"。如需了解其他串行配置,请参阅 kernel.serial kernel_cmdline.md 中的文档。
要在图形控制台显示之前启用早期控制台,请使用
gfxconsole.early
cmdline 选项。如需了解更多信息,请查看
kernel_cmdline.md.
启用 startup.keep-log-visible
可确保内核日志保留
如果 gfxconsole 在启动后显示,就可见。停用 gfxconsole
完全可以通过 driver.<driver
name>.disable
停用它绑定到的视频驱动程序。
在 Skylake 系统中,所有这些选项加起来应如下所示:
$ tools/build-x86/bootserver build-x86/zircon.bin -- gfxconsole.early driver.intel-i915-display.disable
直接输出到控制台,而不是进行缓冲(在
内核冻结时,您可以在 build 中启用 ENABLE_KERNEL_LL_DEBUG
,如下所示:
fx set ... --args='kernel_extra_defines=["ENABLE_KERNEL_LL_DEBUG"]'
此外,还有一个内核 cmdline 参数 kernel.bypass-debuglog,可以设置 设置为 true,以强制输出到控制台,而不是进行缓冲。我们之所以 编译开关和 cmdline 参数是为了便于在内核中进行打印 之后 cmdline 将被强制转到控制台。编译开关设置 会替换 cmdline 参数(如果两者都有)。请注意,编译开关 和 cmdline 参数会停用由 irq 驱动的 uart Tx。
更改模块的编译器优化级别
您可以替换模块的默认 -On
级别,方法是在其
build 参数:
opt_level := <n>
请求回溯
在用户进程中
出于调试目的,系统崩溃日志记录器可以通过 请求。它需要修改源代码,但没有 调试器或作为一般内置调试机制,可能会很有用。
#include "src/lib/debug/backtrace-request.h"
void my_function() {
backtrace_request_all_threads();
}
调用 backtrace\_request
时,会导致
调试程序用于断点处理的异常。
如果未连接调试程序,系统崩溃日志记录器将会
处理异常,输出回溯,然后恢复线程。
来自内核线程
#include <kernel/thread.h>
void my_function() {
thread_print_backtrace(get_current_thread(), __GET_FRAME(0));
}
在启动过程中导出调试数据
为了支持在前期启动期间测试系统,我们提供了一种导出机制 数据文件从内核传输到 /boot 文件系统。如需导出数据文件,请按以下步骤操作: 创建一个 VMO,为其命名,并将其传递给 userboot 并包含类型为 handle_info PA_VMO_DEBUG_FILE(和参数 0)。然后,userboot 会自动传递 然后到 devmgr,devmgr 会将 VMO 导出为路径上的文件
/boot/kernel/<name-of-vmo>
熵收集器质量测试使用此机制 充满随机数据的相对较大(约 1 Mbit)的文件。