首页 > 解决方案 > 调试时如何知道是哪个代码在xv6中造成了陷阱?

问题描述

这是我的假设:当代码导致陷阱(系统调用或异常)时,xv6 将用某些值替换寄存器以将控制转移到alltraps()trap()调用的 .

但是有时xv6会出乎trap()我的意料,我想知道它为什么会陷入这个陷阱。调试的时候,我在里面设置了一个断点trap(),xv6停在这里,我只能在调试器中看到这个(我用的是CLion)。在调用堆栈中,底部的堆栈帧是alltraps()所以我无法找出何时以及为什么会导致陷阱。

我想找出在哪个文件中的哪一行,对于trap(). 这可能吗?

标签: operating-systemxv6

解决方案


如果您trap()更仔细地检查代码,您会发现它还处理硬件中断(定时器、IDE 等)。

     36 void                                                                            
     37 trap(struct trapframe *tf)                                                      
     38 {                                                                               
     39   if(tf->trapno == T_SYSCALL){                                                  
              ...                                                
     47   }                                                                             
     48                                                                                 
     49   switch(tf->trapno){                                                           
     50   case T_IRQ0 + IRQ_TIMER:                                                      
     51     if(cpuid() == 0){                                                           
     52       acquire(&tickslock);                                                      
     53       ticks++;                                                                  
     54       wakeup(&ticks);                                                           
     55       release(&tickslock);                                                      
     56     }                                                                           
     57     lapiceoi();                                                                 
     58     break;                                                                      
     59   case T_IRQ0 + IRQ_IDE:                                                        
             ...

所以你看到的是硬件中断来了,处理器将控制权转移到 IDT 向量之一,然后alltraps再转移到trap(). 您很可能面临定时器中断,它用于上下文切换。

我想找出在哪个文件中的哪一行,陷阱是由某个 trap() 调用引起的。这可能吗?

不,这是不可能的,因为这是一个硬件事件,它与源代码无关。


推荐阅读