调试操作系统

Lig*_*dle 24 debugging operating-system kernel

我正在阅读有关操作系统的一些常规内容并触及一个问题.开发人员在开发操作系统时如何调试,即调试操作系统本身?可以为OS开发人员调试哪些工具?

And*_*ack 24

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

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

  1. 完整性检查以及输出到屏幕.

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

    即使警告也很有用.Linux设置了防护装置,用于在中断处理程序中意外进入睡眠状态的情况.该的mutex_lock功能,例如,将检查(在might_sleep)无论你是在一个不安全的上下文是和打印堆栈跟踪,如果你是.

  2. 调试器

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

    最近,VM开发人员已经找到了如何在没有串行线或内核扩展的情况下调试内核.VMWare 在他们最近的东西中实现了这一点.

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

  3. 确定性重播

    当你遇到一个似乎只出现在制作中的错误时,你希望你能记录发生的事情并重放它,比如安全摄像头.感谢我在伊利诺伊州认识的教授,您现在可以在VMWare虚拟机中执行此操作.VMWare和相关人员比我更好地描述了它,它们提供了看起来很好的文档.

    确定性重播在现场是全新的,所以到目前为止我还没有意识到任何特别惯用的用法.他们说它对安全漏洞也应该特别有用.

  4. 将所有内容移至用户空间.

    最后,内核中的东西仍然更加脆弱,因此遵循Nucleus(或Microkernel)设计有一个巨大的开发优势,在这种设计中,你可以将内核模式组件削减到最低限度.对于其他一切,你可以使用无数的用户空间开发工具,你会更开心.FUSE是一个用户空间文件系统扩展,是一个典型的例子.

    我喜欢这个最后的想法,因为它就像你写的程序是可写的.循环,不是吗?

  • 很好的答案,但在2中你错过了VM也可以在不使用模拟串行线(甚至内核支持)的情况下为调试器提供钩子. (2认同)
  • 很好地写下来,安德烈斯.我会将内存中的日志记录添加到该列表中.为了调试多线程内核状态机,我使用了每处理器日志(不是字符串日志记录,而是数据日志)来调试问题.我已经看到字符串日志记录在循环内核缓冲区中完成(不打印/存储在文件中),用于调试.在我处理的文件系统中,我们记录了从不同代码路径和由谁释放的块的块编号,以调试由于软件错误导致的文件系统损坏.干杯. (2认同)