Есть ли способ получить выравнивание типа в 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 особенность или запустив компилятор самостоятельно, и сделав так, чтобы он генерировал выравнивание так, чтобы его можно было извлечь.

Однако обычно выравнивание не так уж сложно вычислить из соответствующих размеров шрифта, и если ваши целевые архитектуры относительно ограничены, то, вероятно, проще просто свернуть свой собственный компьютер выравнивания.

Другие вопросы по тегам