Debugging 调试操作系统

Debugging 调试操作系统,debugging,operating-system,kernel,Debugging,Operating System,Kernel,我正在浏览一些关于操作系统的一般资料,突然想到了一个问题。开发人员在开发操作系统(即调试操作系统本身)时将如何调试?操作系统开发人员可以使用哪些工具进行调试 你可以使用虚拟机:例如。 或 或者使用类似KDB的串行线路。在引导方案(从头开始的操作系统)中,您可能需要在操作系统内核中引入远程调试功能(内存转储、日志记录等),并使用单独的机器。或者您可以使用虚拟机/虚拟机监控程序 WindowsCE有一个称为KITL的组件-独立于内核的传输层。我想标题说明了它自己。printf日志 附加到进程 严肃的

我正在浏览一些关于操作系统的一般资料,突然想到了一个问题。开发人员在开发操作系统(即调试操作系统本身)时将如何调试?操作系统开发人员可以使用哪些工具进行调试

你可以使用虚拟机:例如。 或

或者使用类似KDB的串行线路。

在引导方案(从头开始的操作系统)中,您可能需要在操作系统内核中引入远程调试功能(内存转储、日志记录等),并使用单独的机器。或者您可以使用虚拟机/虚拟机监控程序

WindowsCE有一个称为KITL的组件-独立于内核的传输层。我想标题说明了它自己。

printf日志 附加到进程 严肃的单元测试 等等

调试内核是很困难的,因为您可能无法依靠崩溃的机器来传达正在发生的事情。此外,错误的代码可能在一些可怕的地方,比如中断处理程序

据我所知,调试操作系统的主要方法有四种:

  • 健全性检查,以及到屏幕的输出

    Linux()上的内核恐慌就是一个很好的例子。Linux人员编写了一个函数,可以打印出他们能找到的内容(包括堆栈跟踪),然后停止所有操作

    甚至警告也很有用。Linux为您可能在中断处理程序中意外进入睡眠状态的情况设置了防护。例如,该函数将检查您是否处于不安全的上下文中,如果处于不安全的上下文中,则打印堆栈跟踪

  • 调试器

    传统上,在调试过程中,计算机所做的一切都是通过串行线路输出到稳定的测试机器。随着虚拟机的出现,您现在可以将一个VM的执行串行线连接到同一物理机上的另一个程序,这非常方便。当然,这需要操作系统发布它正在做的事情,并等待调试器连接。(Linux)和(Windows)是一些类似的操作系统调试器。VMWare

    最近,虚拟机开发人员已经了解了如何在没有串行线或内核扩展的情况下调试内核。VMWare最近的产品

    在我看来,在操作系统中调试的问题与。中断(您的大多数硬错误肯定会发生)是异步的、频繁的和不确定的。如果您的bug以特定方式与两个中断的重叠有关,则不会使用调试器公开它;这个错误可能根本不会发生。也就是说,它可能会,然后调试器可能会有用

  • 确定性重播

    当你发现一个似乎只在生产中出现的bug时,你希望你能记录下发生的事情并重播它,就像安全摄像头一样。多亏了,您现在可以在VMWare虚拟机中执行此操作。VMWare和相关人员比我做得更好,他们提供了类似的功能

    确定性回放在现场是全新的,到目前为止,我还不知道有什么特别惯用的用法。他们说它对安全漏洞也应该特别有用

  • 将所有内容移动到用户空间

    最后,内核中的东西更脆弱,因此遵循Nucleus(或微内核)设计有着巨大的开发优势,您可以将内核模式组件减到最小。在其他方面,你可以使用大量的用户空间开发工具,你会更快乐,用户空间文件系统扩展就是一个典型的例子

    我喜欢最后一个想法,因为它就像你写的程序是可写的。不是吗


  • 使用内核调试器进行远程调试,这也可以通过虚拟化完成。

    调试操作系统不适合胆小的人。由于内核正在调试中,您的选择将非常有限。大量的
    printf
    语句是一个技巧,而且,这取决于我们可能谈论的真正调试的“操作系统”

    • 文件系统
    • 司机
    • 内存管理
    • 原始磁盘输入/输出
    • 屏幕输入/输出
    • 内核
    同样,这是一个变化很大的练习,如上所述,它们都相互作用。更复杂的事实是,假设您要调试内核,如果运行时环境设置不正确,您将如何进行调试(我指的是内核加载二进制可执行文件的责任)

    有些内核可能(并非所有内核都有)包含一个简单的调试监视器,事实上,如果我没记错的话,在Sams publishing的Richard a Burgess的《开发自己的32位操作系统》一书中,他包含了一个调试监视器,它显示CPU、寄存器等的各种状态

    同样,考虑到二进制可执行文件需要特定的加载机制,例如gdb等价物,如果没有设置加载二进制文件的环境,那么您的选项是非常有限的

    通过使用大量的
    printf
    语句将错误、日志等显示到一个单独的终端或一个文件,这是最好的调试方式,听起来确实是一场噩梦,但值得为此付出努力

    希望这有帮助, 顺致敬意,
    汤姆。

    +1,问得好!我不知道答案,但我所知道的是,当然你不能使用“正常”的调试器,因为内核运行在它上面…通过认真思考!操作系统开发者似乎有点反内核调试器——著名的是Linus Torvalds。Linus Torvalds说,只有傻瓜才需要内核调试器:P套用Bjarne Stroustroup的话,“新手总是比专家多。”调试器有时很有用。从经验中了解到调试器对您没有帮助:也很有用。Linus还说Emacs是“邪恶的”(尽管编写了大量linux)