Почему тип данных `bool` делает мою структуру данных нечитаемой для avr-gdb? - PullRequest
0 голосов
/ 21 января 2019

У меня есть структура данных, которая выглядит следующим образом:

#include <stdbool.h>
.
.
.
typedef struct Input {
    uint8_t pin;        /**< Pin associated with this input */
    bool state,         /**< Current pin state */
         last_state;    /**< Pin state last time we checked */
} Input;

Я инициализирую структуру данных следующим образом:

Input *input = (Input *)malloc(sizeof(Input));
input->pin = 0;
input->state = false;
input->last_state = false;

Я компилирую код с помощью avr-gcc 7.2.0 и запускаю код с помощью simulavr ("SimularAVR 1.2dev") и присоединяюсь к нему с помощью avr-gdb.

Когда я распечатываю структуру данных в gdb сразу после инициализации, я вижу это:

(gdb) p *input
$1 = {pin = 0 '\000', state = false}

Обратите внимание, что элемент last_state не отображается. Кроме того, если я установлю один из существующих членов, то, похоже, они на самом деле ссылаются на одно и то же местоположение:

(gdb) set input->pin=123
(gdb) p *input
$8 = {pin = 123 '{', state = 123}

Если я изменю тип данных state и last_state с bool на, скажем, uint8_t, вот так ...

typedef struct Input {
    uint8_t pin;        /**< Pin associated with this input */
    uint8_t state,      /**< Current pin state */
            last_state; /**< Pin state last time we checked */
} Input;

... тогда все отображается правильно:

(gdb) p *input
$1 = {pin = 0 '\000', state = 0 '\000', last_state = 0 '\000'}

Что здесь происходит? Это ошибка в gdb? В simulavr? Что-то другое? Обратите внимание, что сам код работает правильно при развертывании на целевом микроконтроллере (attiny85); это полностью проблема отладки / симуляции.

1 Ответ

0 голосов
/ 21 января 2019

Это ошибка в gdb?

Это определенно ошибка либо в gdb, либо в avr-gcc - либо отладочная информация неверна (ошибка в gcc) или GDB неправильно его интерпретирует (ошибка в GDB).

simulavr не имеет к этому никакого отношения.

Чтобы узнать больше, readelf -wi a.out и сравните описаниеstruct Input в рабочем и нерабочем случае.Они должны различаться только типом полей state и last_state.Если это то, что вы действительно наблюдаете, то, скорее всего, ошибка GDB.

...