2016-04-08 60 views
-1

我正在嘗試調試xv6,使用qemu模擬器,使用gdb內核。GDB不會識別新文件/行

如何,gdb不會識別我對文件做的任何附加操作。例如,它不會識別新的文件,甚至新的生產線在現有的文件,例如:

在文件x86.hi添加anouther功能,這是代碼(i已經添加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

會很樂意提供任何幫助。謝謝。

+1

想必,它仍然固定在舊的。 –

+0

我該如何解決這個問題?我試圖尋找修改的gdb文件,或者甚至重新安裝gdb –

+1

'make clean'。重新編譯。 –

回答

1

gdb無法識別我對文件做的任何附加操作。
我已經創建了一個新副本,更新了修改後的文件,並進行了編譯(新鮮)。沒有工作

這很可能意味着你正在調試的文件的舊副本你認爲正在調試。

這樣做:

  1. ls -il xv6觀察其(最近)日期和時間。它應該是最近的,因爲你已經完成了make clean並重建了它。
  2. 現在rm -f xv6; ls -l xv6驗證文件已經消失。
  3. 現在嘗試再次調試,並觀察你仍然可以(這證明了我的猜測)。
  4. 搞清楚你是什麼樣的副本其實調試和更新
  5. 利潤。

更新:

我更新了正確的文件,正如我在最初的帖子中提到,當我真正考慮使用gdb的,我可以看到修改的文件內容。

你(顯然)在談論源文件。 GDB 不在乎關於源文件,而不使用他們(除非你問GDB的list他們)。 GDB只關心編譯的二進制文件,而是你在某種程度上忽略更新的文件。

+0

我正在更新正確的文件,正如我在初始文章中提到的,當我真正使用gdb查看文件內容時,我可以看到修改。它只是不會識別任何新的符號或新的文件。我更新了存儲庫中的更改,從系統中刪除了任何xv6的跟蹤,並將其克隆回來,所有分支中的所有文件都帶有additiong。而且,它仍然不會認識到這些新功能。 –

+1

@OrDinari我已經更新了答案。 –

+0

謝謝,但我沒有忽略更新任何二進制文件,我已經擦除了二進制文件,然後再編譯一次。然而,問題解決了這個問題,因爲沒有任何理由,也沒有我做任何不同的事情,1「乾淨的qemu-gdb」沒有正常工作,而後一個正確。 –