-1

我正在尝试使用 qemu 模拟器和 gdb 内核调试 xv6。

但是,gdb 不会识别我对文件所做的任何添加。例如,它不会识别新文件,甚至是现有文件中的新行,例如:

在文件 x86.hi 中添加了另一个函数,这是代码(我添加了 cas):

static inline void
lcr3(uint val)
{
  asm volatile("movl %0,%%cr3" : : "r" (val));
}

static inline uint
cas(volatile int *addr,int expected, int newval)
{
  uint flags;
  uint zf;
  asm volatile("movl %0,%%eax;lock;cmpxchg %2,%3;jne afterChange;movl %%eax,%0;afterChange:;pushfl; popl %1":"+m"(*addr),"=r"(flags):"r"(expected),"r"(newval):"%eax");
  zf = (flags >> 6) & 1;
  return zf;
}

gdb 将识别 lcr3,但不会识别 cas,但是,当我实际搜索文件时,我可以找到以下行:

(gdb) list lcr3
138   return val;
139 }
140 
141 static inline void
142 lcr3(uint val)
143 {
144   asm volatile("movl %0,%%cr3" : : "r" (val));
145 }
146 
147 static inline uint
(gdb) list
148 cas(volatile int *addr,int expected, int newval)
149 {
150   uint flags;
151   uint zf;
152   asm volatile("movl %0,%%eax;lock;cmpxchg %2,%3;jne afterChange;movl %%eax,%0;afterChange:;pushfl; popl %1":"+m"(*addr),"=r"(flags):"r"(expected),"r"(newval):"%eax");
153   //zf = (flags >> 6) & 1;
154   zf = flags;
155   return zf;
156 }
157 

我正在使用这个makefile(基本的xv6 makefile): https ://github.com/mit-pdos/xv6-public/blob/master/Makefile

很高兴得到任何帮助。谢谢你。

4

1 回答 1

1

gdb 不会识别我对文件所做的任何添加。
我创建了一个新副本,更新了修改后的文件,并编译(新鲜)。不工作

这很可能意味着您正在调试您认为正在调试的文件的旧副本。

做这个:

  1. ls -il xv6观察其(最近的)时间戳。它应该是最近的,因为您已经完成make clean并重建了它。
  2. 现在rm -f xv6; ls -l xv6验证文件是否已消失。
  3. 现在尝试再次调试它,并观察你仍然可以(这证明了我的猜测)。
  4. 找出你实际调试的副本,然后更新
  5. 利润。

更新:

正如我在最初的帖子中提到的那样,我正在更新正确的文件,当我实际使用 gdb 查看文件内容时,我可以看到修改。

您(显然)在谈论源文件。GDB不关心源文件,也不使用它们(除非您向 GDB 询问list它们)。GDB 只关心已编译的二进制文件,就是您忽略更新的文件。

于 2016-04-09T03:28:36.380 回答