调试时如何知道是哪个代码导致了 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?
不,这不可能,因为这是一个硬件事件,与源代码无关。
这是我的假设:当代码导致陷阱(系统调用或异常)时,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?
不,这不可能,因为这是一个硬件事件,与源代码无关。