Используйте макрос *_get_instance_private() в отладчике GDB
glib генерирует макрос x_get_instance_private()
для типа x
,
При отладке с помощью gdb
Я не могу назвать макросы.
Как просмотреть личные данные экземпляра? Функция, которую я отлаживаю, получает частные данные экземпляра, но переменная, в которой они хранятся, была <optimized out>
,
3 ответа
Вы могли бы использовать g_type_class_get_instance_private_offset
,
Основано на ответе Sourcejedi для NMManager (NetworkManager):
(gdb) p *( (NMManagerPrivate *) ((char *) manager
+ g_type_class_get_instance_private_offset(
((GTypeInstance *)manager)->g_class )))
Это работает, когда частное не точно перед объектом. Проверено на NMManager, где макет не является стандартным GObject.
При отладке с использованием GDB я не могу вызывать макросы.
Обратите внимание, что если вы компилируете с -g3
, тогда gcc поместит тела макросов в отладочную информацию, а gdb позволит вам использовать их в выражениях.
Тем не менее, gdb понимает только подмножество "expression" в C - поэтому, если макрос вводит новую область видимости или выполняет другие нетривиальные вещи, он не будет работать.
Пример для GsShell
(Гном-программное обеспечение). у меня есть GObject
называется object
, Я обнаружил экспериментом: личные данные хранятся до GObject
,
(gdb) p *( (*GsShellPrivate) ((char *) object - sizeof(GsShellPrivate)) )