Используйте макрос *_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)) )

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