为什么`bool`数据类型使avr-gdb无法读取我的数据结构?

时间:2019-01-21 03:40:32

标签: gcc gdb avr

我有一个看起来像这样的数据结构:

#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}

如果我将statelast_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 :(得分:0)

  

这是gdb中的错误吗?

这绝对是gdbavr-gcc中的错误-调试信息不​​正确(gcc中的错误)或GDB无法正确解释它(GDB中的错误)

simulavr与此无关。

要了解更多信息,请readelf -wi a.out并在工作和非工作情况下比较struct Input的描述。它们仅应在statelast_state字段的类型上有所不同。如果您实际上是这样观察的,则很可能是GDB错误。