gdb: показать typeinfo некоторых данных

По сути, я хочу получить typeid(*this).name(), то есть реальный тип this.

Я хочу получить это в GDB (без изменения исходного кода). Я попробовал print typeid(*this), но он говорит, что typeid неизвестен (потому что я не включил его в исходный файл).


person Albert    schedule 05.03.2012    source источник
comment
gdb не поддерживает typeid.   -  person trojanfoe    schedule 05.03.2012
comment
такая же проблема сейчас с lldb...   -  person dev_null    schedule 28.07.2015
comment
Возможный дубликат Как определить, является ли объект экземпляром определенного класса C++ в GDB   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 05.05.2016
comment
Если кто-то пришел сюда, пытаясь показать тип данной переменной, команда whatis вам в помощь.   -  person Hi-Angel    schedule 26.10.2016


Ответы (4)


Используйте команду ptype, например:

(gdb) ptype 42
type = int
person Star Brilliant    schedule 18.06.2015
comment
Это возвращает такие вещи, как type = unsigned short, но я хочу, чтобы вместо этого возвращалось type = uint16_t, чтобы я мог действительно знать, сколько байтов это при проверке памяти. Есть ли способ сделать это? Лучшее, что я могу придумать, это сделать print &my_var, что напечатает (uint16_t *) 0x7ffffffefc2c, тем самым показывая, что его тип указателя — uint16_t*, что означает, что его тип — uint16_t. - person Gabriel Staples; 14.08.2020
comment
Я представил это как ответ, но если у вас есть лучший способ сделать это, я все уши: stackoverflow.com/a/63404160 /4561887. - person Gabriel Staples; 14.08.2020

Команда «ptype [ARG]» напечатает тип.

person t. fochtman    schedule 08.01.2014
comment
По крайней мере, в gdb v7.6.1 это не помогает в этом вопросе, поскольку печатает только статический, а не полиморфный тип. Например, если d — объект типа D, производный от базового класса B, то B* b = &d; (gdb) ptype b type = class B { - person Tom Goodfellow; 27.05.2014
comment
[с установленным объектом печати он получает префикс type = /* real type = D * */, но затем то же самое] - person Tom Goodfellow; 27.05.2014


Как говорит @Star Brilliant, это:

ptype my_var

возвращает такие вещи, как type = unsigned short, но я хочу, чтобы вместо этого он возвращал type = uint16_t, чтобы я мог действительно знать, сколько байтов это при проверке памяти. Лучшее, что я могу понять, чтобы получить этот эффект, это сделать:

print &my_var

который печатает (uint16_t *) 0x7ffffffefc2c, тем самым показывая, что его тип указателя — uint16_t*, что означает, что его тип — uint16_t.

Я считаю, что это более полезно, чем ptype my_var, но желателен более прямой способ получить этот эффект, если у вас есть какие-либо предложения.

Примеры команд gdb и вывод:

(gdb) ptype my_var
type = unsigned short
(gdb) print &my_var
$27 = (uint16_t *) 0x7ffffffefc2c

Опять же, примечание ptype my_var показывает, что это unsigned short, тогда как print &my_var показывает более подробный и желаемый ответ, который заключается в том, что это uint16_t.

person Gabriel Staples    schedule 13.08.2020