2014-05-20 54 views
1

我正在用gdb調試一個非常簡單的彙編程序(SPARC),並且遇到了一個奇怪的問題。我正在嘗試使用gdb將argv中的參數打印到我的程序的主函數中。由於某些原因,$ i1中的地址(main的第二個參數)有時會更改爲指向-1。這裏是我的gdb會話的複製粘貼:爲什麼這個地址在gdb中改變?

(gdb) p/x $i1 
$1 = 0xffbff084 
(gdb) x/x 0xffbff084 
0xffbff084:  0xffbff1e4 
(gdb) x/s 0xffbff1e4 
0xffbff1e4:  "..." 
(gdb) x/x 0xffbff088 
0xffbff088:  0xff 
(gdb) x/x 0xffbff084 
0xffbff084:  0xff 

我用「...」而不是打印的實際路徑。

我正確地打印了第一個參數,但不是獲取第二個參數的地址,gdb說下一個值是-1。我再次檢查第一個字符串的地址,gdb說它也是-1,即使我剛發現它是別的東西!

這不是一個多線程的程序,所以我不知道有什麼可以改變地址:/

編輯:似乎只發生用x/s到的地址打印內容之後。

回答

5

gdb'x'命令接受斜線後的打印格式和大小作爲選項。在manual它說:

每次用x指定單位大小時,下次使用x時,該大小將成爲默認單位。

它還說:

對於「S」格式,單元大小默認到「b」,除非是明確地給出。

所以發生的是你給的命令x/s後,後續x命令被解釋爲對字節長度。因此它只打印正在嘗試檢查的內存的第一個字節,恰好是0xff。

嘗試使用x/xw打印地址,而不是僅使用x/x

相關問題