Отладчик QtCreator / GDB: недоступен, или объект `this` не показан - PullRequest
0 голосов
/ 06 февраля 2019

В моем main() у меня есть некоторая переменная (reader) в стеке, которая имеет тип OggReader (некоторые собственные struct / class).Эта переменная отображается как <not accessible> в отладчике Qt Creator / GDB:

screen1

Затем я вызываю некоторую функцию для этого класса, так что this должен указывать на этот reader объект.Но Qt Creator / GDB не показывает содержимое this:

screen2 screen3

Почему?Как я могу это исправить?

Это Qt Creator 4.0.2 в Ubuntu 16.04.Я использую g ++ 5.4.0 с параметрами -g -O0 -g3 -ggdb.Я использую GDB 7.11.1.

Класс OggReader:

struct OggReader {
    Page buffer_page_;
    std::map<uint32_t, VorbisStream> streams_;
    size_t packet_counts_;
    std::shared_ptr<IReader> reader_;
    ParseCallbacks& callbacks_;

    OggReader(ParseCallbacks& callbacks) : packet_counts_(0), callbacks_(callbacks) {}

    ...
};

Page:

struct Page {
    PageHeader header;
    uint8_t segment_table[256]; // page_segments_num in len
    uint32_t data_len;
    uint8_t data[256 * 256];

    ...
};

PageHeader:

struct __attribute__((packed)) PageHeader {
    char capture_pattern[4]; // should be "OggS"
    uint8_t stream_structure_version; // should be 0
    uint8_t header_type_flag; // 0x1: continued, 0x2: first (bos), 0x4: last (eos)
    int64_t absolute_granule_pos; // end PCM sample position of the last packet completed on that page
    uint32_t stream_serial_num;
    uint32_t page_sequence_num;
    uint32_t page_crc_checksum;
    uint8_t page_segments_num;
};

Может __attribute__((packed)) как-то смущает GDB?Даже когда я явно делаю это

Page* dummy = &buffer_page_;

внутри некоторой Page функции-члена, он также не показывает содержимое этого dummy ptr (это тот же адрес, что и this, потому что buffer_page_начинается с нулевого смещения от this).

Этот вопрос связан, хотя я думаю, что речь идет не о this (некоторые собственные struct / class), а вместоо стандартных типах (std::string или около того).Также все приведенные решения не имеют эффекта или не применяются.Например, «Загрузка системных GDB красивых принтеров» уже отключена.

1 Ответ

0 голосов
/ 06 февраля 2019

Причина в том, что в оптимизированных сборках у вас могут быть некоторые переменные, которые оптимизированы или доступны только в регистрах.В этих случаях отладчики не могут получить значения, и вы увидите, что эти <not accessible> или <optimized away>.

понизят уровень оптимизации, и вы начнете видеть больше этих переменных (пристоимость уменьшенной скорости).

Кажется, здесь также нет отображения по умолчанию нестандартных типов.char* отображаются, потому что это строка в стиле C, поэтому для них будет правильное отображение.Так же, как VS имеет файлы natvis, QtCreator поддерживает помощники , файлы Python, которые могут использоваться для отображения именно того, что вам нужно.

Если вы просто хотите получить константу структуры, когда вы толькоесть указатель, вы также можете сделать: const auto& v = *this;.

...