-1

gdbカーネルでqemuエミュレーターを使用して、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 

私はこのメイクファイル (基本的な xv6 メイクファイル) を使用しています: 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 に答える