operating-system - 调试时如何知道是哪个代码在xv6中造成了陷阱?
问题描述
这是我的假设:当代码导致陷阱(系统调用或异常)时,xv6 将用某些值替换寄存器以将控制转移到alltraps()
被trap()
调用的 .
但是有时xv6会出乎trap()
我的意料,我想知道它为什么会陷入这个陷阱。调试的时候,我在里面设置了一个断点trap()
,xv6停在这里,我只能在调试器中看到这个(我用的是CLion)。在调用堆栈中,底部的堆栈帧是alltraps()
所以我无法找出何时以及为什么会导致陷阱。
我想找出在哪个文件中的哪一行,对于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()
. 您很可能面临定时器中断,它用于上下文切换。
我想找出在哪个文件中的哪一行,陷阱是由某个 trap() 调用引起的。这可能吗?
不,这是不可能的,因为这是一个硬件事件,它与源代码无关。
推荐阅读
- python - 每次变量增加时如何调用方法?
- node.js - 如何做DynamoDB细粒度访问控制?
- ruby-on-rails - 如何编写 RSpec 测试以确保 Searchkick 重新索引记录?
- db2 - DB2 中的 REGEXP 或 TRANSLATE 会是 REPLACE 的另一种选择吗?
- python - 如何在 kivy android webview 中打开文件选择器?
- asp.net - 仍然建议使用 DotNetOpenAuth NuGet 包来构建 .NET OAUTH2 授权服务器?
- spring - Spring批处理元数据表的意义
- java - 为什么我无法从 servlet 接收列表?
- mysql - SQL - 修改记录以获取一列中季度的总余额,即使对于 SQL 中的特定季度也是如此
- laravel - 如何在 Laravel 中加入多个表?