调试时如何知道是哪个代码导致了 xv6 中的陷阱?

How to know which code caused a trap in xv6 when debugging?

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

但有时xv6会出乎我的意料trap(),我想知道它为什么会落入这个圈套。调试时,我在 trap() 中设置断点并且 xv6 停在这里后,我在调试器中只能看到 this (我使用的是 CLion)。在调用栈中,最底层的栈帧是alltraps()所以我无法找出陷阱是什么时候以及为什么造成的。

想知道trap()的某个调用在哪个文件,哪一行造成的trap。这可能吗?

如果您更仔细地检查 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()。您很可能面临定时器中断,它用于上下文切换。

I want to find out in which file, at which line the trap is caused for a certain call of trap(). Is this possible?

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