0x3a45×1234 0x0352十六進制數據的十六進制流(實時更長的時間)
我知道,這是一個結構的內容。 gdb中有一種方法可以將這個映射到結構上嗎? Gdb似乎只接受單個值做這個。
喜歡:
(GDB)打印(MYSTRUCT)0x3a45 0x1234的0x0352
$ 1 = {A = 3A,B = 45,F = 0×1234,C = 03,E = 52}
在這種情況下,它非常簡單,但是結構複雜,十六進制字符串更大。
0x3a45×1234 0x0352十六進制數據的十六進制流(實時更長的時間)
我知道,這是一個結構的內容。 gdb中有一種方法可以將這個映射到結構上嗎? Gdb似乎只接受單個值做這個。
喜歡:
(GDB)打印(MYSTRUCT)0x3a45 0x1234的0x0352
$ 1 = {A = 3A,B = 45,F = 0×1234,C = 03,E = 52}
在這種情況下,它非常簡單,但是結構複雜,十六進制字符串更大。
我認爲有幾個可行的方法,在gdb來做到這一點。
最簡單的方法就是以某種方式將數據寫入下的內存。它看起來是這樣的:
(gdb) set $mem = malloc(50) # number of bytes
(gdb) set $mem[0] = 0x72
(gdb) set $mem[1] = 0xff
# etc - you can find faster ways to do this
(gdb) print *(struct whatever *) $mem
填補記憶是痛苦的,但這個可以編寫腳本。例如,你可以寫一個小shell腳本的原始字節轉換成set
命令序列,然後source
它。或者你可以在Python中編寫一個新的gdb命令,將其自動化。
GDB也有一個擴展,讓一個建立在命令行上的數組,並做一種就可以了「重新詮釋投」。我發現這個方法有點不太方便,因爲我只能使陣列功能創建的int
,不char
陣列。但無論如何,考慮這個小程序:
struct x {
int a;
long b;
};
int main() {
struct x x = { 23, 97 };
return 0;
}
我啓動gdb,並停止對return
,然後檢查內存:
(gdb) p sizeof(int)
$1 = 4
(gdb) p sizeof(x)
$2 = 16
(gdb) x/4xw &x
0x7fffffffe240: 0x00000017 0x00007fff 0x00000061 0x00000000
(即第二個字是垃圾,因爲它是在結構中填充。 ..)
現在,我們可以用手從原始數據重建x
:
(gdb) print {struct x}{0x17, 0x7fff, 0x61, 0}
$3 = {
a = 23,
b = 97
}
該表達式對gdb提供的C表達式使用了兩個擴展。首先,{0x17, 0x7fff...}
是寫入數組的一種方式。其次,{struct x}
是一種「重新解釋強制轉換」 - 它將值的原始字節重新解釋爲命名類型。