2015-04-23 71 views
1

我試圖檢查用gdb內存long double陣列這可能嗎?我不知道用x甚至p命令使用什麼後綴? 比如我有(氣體語法):GDB檢查長雙陣列

array: .tfloat 5, 6, 7 
fldt array 
fldt array+10 
fldt array+20 

,並在gdb我能夠直接從浮點棧打印這些值:

(gdb) p $st0 
$4 = 7 
(gdb) p $st1 
$5 = 6 
(gdb) p $st2 
$6 = 5 

但我不能找到一種方法來檢查所有這些只使用數組的地址,這樣的價值觀:

(gdb) x/4gf &array 
0x4000b0 <array>: -1,4916681462400413e-154 8,0952656071088246e-320 
0x4000c0 <array+16>: 5,3055561114210832e-315 1,3063763415981806e-9 

(我知道爲什麼這一次不工作,因爲「G」是指8個字節)

我當然可以通過一些小工具和解決方法手動訪問這些東西。

(gdb) p *(long double*)(*(array)) 
$11 = 5 
(gdb) p *(long double*)(*(array+10)) 
$12 = 6 
(gdb) p *(long double*)(*(array+20)) 
$13 = 7 
(gdb) p *(long double*)(*(array))+1 
$21 = 6 
(gdb) p *(long double*)(*(array))+2 
$22 = 7 

但我希望我缺少的文件的東西,還有就是打印出全陣列,而不是打印每個元素的更簡單的方法,我有陣列很多很多的元素來檢查不時。

gdb --version 
GNU gdb (Gentoo 7.7.1 p1) 7.7.1 

回答

1

問題是,long double是默認96位由於填充和顯然gdb僅理解的格式。實際精度爲80位,這就是爲什麼您可以逐一打印它們,但尺寸會影響下一個項目在數組中的位置。

作爲一種變通方法,您可以添加填充過,或者寫一個腳本gdb,超過你的元素進行迭代。

array: .tfloat 5 
.byte 0,0 
.tfloat 6 
.byte 0,0 
.tfloat 7 
.byte 0,0 
(gdb) p (long double[3])array 
$1 = {5, 6, 7} 
+0

'(GDB)P(長雙[3])陣列 無效cast.'不幸的是我不能做這種鑄造。 – mucka