Есть ли способ получить выравнивание типа в Python API GDB (или непосредственно в GDB)?
Для симпатичного принтера, который я пишу, я хотел бы знать выравнивание или тип, который используется в контейнере. К сожалению используя alignof()
или любой другой "стандартный" оператор не работает ( https://sourceware.org/bugzilla/show_bug.cgi?id=17095). Использование "типичных" трюков макросов, которые работают непосредственно в исходном коде, также не работает:
p ((char *)(&((struct { char c; double _h; } *)0)->_h) - (char *)0)
A syntax error in expression, near `{ char c; double _h; } *)0)->_h) - (char *)0)'.
Это вообще возможно, или, может быть, единственный способ - это поддерживать GDB внутри?
1 ответ
Нет никакой возможности получить эту информацию, потому что в настоящее время GDB не имеет ее.
До версии 5 DWARF не было стандартного способа выразить выравнивание в отладочной информации. Добавлено DWARF 5 DW_AT_alignment
, но GDB все еще просто игнорирует этот атрибут; чтобы выставить его через Python API, нужно прочитать его и сохранить во внутреннем gdb struct type
, Я пока не знаю, генерируют ли компиляторы этот атрибут.
Если бы вы были в отчаянии, вы могли бы сделать это либо с помощью GDB compile
особенность или запустив компилятор самостоятельно, и сделав так, чтобы он генерировал выравнивание так, чтобы его можно было извлечь.
Однако обычно выравнивание не так уж сложно вычислить из соответствующих размеров шрифта, и если ваши целевые архитектуры относительно ограничены, то, вероятно, проще просто свернуть свой собственный компьютер выравнивания.