Sen gdb
ile bunu yapabilirsiniz. gdb
yılında
struct A {
int a;
char b;
short c;
};
int main() {
struct A a;
}
ikili yukarı yükleme: Örnek olarak, ben bu kaynağı kullanacağız
(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
GÜNCELLEME: Eğer çok sayıda için bunu yapmak gerekiyorsa
alanların daha sonra GDB'nin yeni python arayüzünü kullanmak için kullanışlı bulabilirsin (bunu kullanmak için GDB'nin yeni bir sürümüne ihtiyacınız olacak, 7.4 kullanıyorum). Ben offsets.py oluşturduk: gibi, GDB kullanmadan Sonra
python
sys.path.insert(0, '/path/to/script/dir')
import offsets
end
:
(gdb) offsets-of "struct A"
struct A {
a => 0
b => 4
c => 6
}
Bu komut bir hale getirir
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()
Sonra .gdbinit ekleyebileceğiniz varsayımları basitleştirerek, bitfields kullanmamanız gibi, ve iç içe geçmiş yapıları kazmıyorsunuz, ancak bu değişiklikler, ihtiyaç duyduğunuzda oldukça basittir.
Muhtemelen burada bariz bir şey eksik, ama bir yapı örneği (veya yapısına bir işaretçi) olarak bildirilen bir değişkeniniz varsa ('x' diyelim), o zaman sadece yazabilmeniz gerekir. Tüm üyeleri boşaltmak için gdb’de x' (ya da 'işaretçi x''se işaretçi) yazdırın. –
Ben dökmek istediğimin adresini almaya çalışmıyorum. Zaten çöplüğüm var ve tüm üyelerin göreli adresine ihtiyacım var. – Akhneyzar