我有一个看起来像这样的数据结构:
#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)后即可正确运行;这完全是调试/模拟问题。
答案 0 :(得分:0)
这是gdb中的错误吗?
这绝对是gdb
或avr-gcc
中的错误-调试信息不正确(gcc
中的错误)或GDB无法正确解释它(GDB中的错误)
simulavr
与此无关。
要了解更多信息,请readelf -wi a.out
并在工作和非工作情况下比较struct Input
的描述。它们仅应在state
和last_state
字段的类型上有所不同。如果您实际上是这样观察的,则很可能是GDB错误。