Możesz to zrobić pod numerem gdb
. Jako przykład, będę korzystać z tego źródła:
struct A {
int a;
char b;
short c;
};
int main() {
struct A a;
}
załadunku binarny w gdb
:
(gdb) print (int)&((struct A*)0)->a
$1 = 0
(gdb) print (int)&((struct A*)0)->b
$2 = 4
(gdb) print (int)&((struct A*)0)->c
$3 = 6
UPDATE:
Jeśli musisz to zrobić dla dużej liczby pól, wtedy może ci się przydać użycie nowego interfejsu Pythona GDB (będziesz potrzebować ostatniej wersji GDB, aby go użyć, używam 7.4). Utworzyłem offsets.py:
import gdb
class Offsets(gdb.Command):
def __init__(self):
super (Offsets, self).__init__ ('offsets-of', gdb.COMMAND_DATA)
def invoke(self, arg, from_tty):
argv = gdb.string_to_argv(arg)
if len(argv) != 1:
raise gdb.GdbError('offsets-of takes exactly 1 argument.')
stype = gdb.lookup_type(argv[0])
print argv[0], '{'
for field in stype.fields():
print ' %s => %d' % (field.name, field.bitpos//8)
print '}'
Offsets()
Następnie można dodać do .gdbinit:
python
sys.path.insert(0, '/path/to/script/dir')
import offsets
end
następnie używając go w GDB, jak:
(gdb) offsets-of "struct A"
struct A {
a => 0
b => 4
c => 6
}
Skrypt ten sprawia, że kilka upraszczających założeń, tak jak to, że nie używasz bitfieldów, i nie kopie w zagnieżdżone struktury, ale te zmiany są 3 dość proste, jeśli ich potrzebujesz.
Prawdopodobnie brakuje tu czegoś oczywistego, ale jeśli masz zmienną (powiedzmy 'x'), która jest zadeklarowana jako instancja struktury (lub wskaźnik do struktury), powinieneś być w stanie po prostu wpisać' wypisz x' (lub 'print * x' jeśli wskaźnik) w gdb, aby zrzucić wszystkie elementy. –
Nie próbuję uzyskać adresu tego, co chcę zrzucić. Już mam dump i potrzebuję względnego adresu wszystkich członków. – Akhneyzar