求助,同一结构体居然打印出不同结果
下面代码是使用gdb调试输出的信息
(gdb) p/x (char)peer_cpu_beat_frame@33
$34 = {0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xd4, 0x95, 0x52, 0x1, 0x2, 0x0, 0x0, 0xe9, 0x1e, 0x0 <repeats 14 times>, 0x32}
(gdb) p/x *(char*)frame@33 # 打印内存空间,其余peer_cpu_beat_frame的内存数据完全一样
$35 = {0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xd4, 0x95, 0x52, 0x1, 0x2, 0x0, 0x0, 0xe9, 0x1e, 0x0 <repeats 14 times>, 0x32}
(gdb) p &peer_cpu_beat_frame
$36 = (CpuHeartBeatFrame *) 0x809b900
(gdb) p frame #打印内存地址,表明都是同一地址。
$37 = (const CpuHeartBeatFrame *) 0x809b900
(gdb) ptype peer_cpu_beat_frame #确认peer_cpu_beat_frame结构信息
type = struct {
FrameHead head;
unsigned char local_cpu_state;
unsigned char relay_state;
unsigned char hmi_comm_state;
unsigned char eeu_comm_state;
unsigned char dual_series_comm_state;
unsigned char switch_comm_state;
unsigned char mo_comm_state;
unsigned char local_cpu_failure_state;
unsigned char local_cpu_interlocking_state;
unsigned int timer_elapsed_cycles;
}
(gdb) p peer_cpu_beat_frame.timer_elapsed_cycles #打印最后一个变量信息
$38 = 838860800
(gdb) p frame->timer_elapsed_cycles #打印最后一个变量信息,发现与上一项不一致,这是为什么?
$39 = 50
(gdb) p &frame->timer_elapsed_cycles #打印变量所指的地址
$40 = (uint32_t *) 0x809b920
(gdb) p &peer_cpu_beat_frame.timer_elapsed_cycles #通过打印地址发现果真偏移了3个位置
$42 = (unsigned int *) 0x809b91d
(gdb) bt #下面是程序运行的堆栈信息
#0 cpu_heartbeat_print (frame=0x809b900) at /home/zhangys/platformsoft/01primary/src/syn_data/cpu_heartbeat.c:36
#1 0x080536ea in cpu_recv_heartbeat () at /home/zhangys/platformsoft/01primary/src/core/cpu_communicate.c:174
#2 0x08051407 in cpu_try_recv_heartbeat () at /home/zhangys/platformsoft/01primary/src/core/cpu_heartbeat_int.c:70
#3 0x080514a1 in cpu_beatheart_action () at /home/zhangys/platformsoft/01primary/src/core/cpu_heartbeat_int.c:124
#4 0x0805297d in timer_action (sig=34, si=0xbffff27c, uc=0xbffff2fc) at /home/zhangys/platformsoft/01primary/src/core/timer.c:95
#5 <signal handler called>
#6 fsm_be_end_state (fsm=0x80903e0) at /home/zhangys/platformsoft/01primary/src/core/ci_cycle.c:1200
#7 0x0805279f in fsm_run (fsm=0x80903e0) at /home/zhangys/platformsoft/01primary/src/core/ci_cycle.c:1232
#8 0x0805282c in ci_one_cycle () at /home/zhangys/platformsoft/01primary/src/core/ci_cycle.c:1291
#9 0x08052d34 in run () at /home/zhangys/platformsoft/01primary/src/core/app.c:127
#10 0x08051565 in main (argc=1, argv=0xbffff714) at /home/zhangys/platformsoft/01primary/src/core/main.c:2
int32_t cpu_recv_heartbeat(void)
{
int ret = 0;
cpu_heartbeat_clear(&peer_cpu_beat_frame);
/*务必使用阻塞方式接受*/
ret = cpu_com_read(ST_HEARTBEAT);
if (0 == ret)
{
log_msg("new elapsed_cycles:%d",peer_cpu_beat_frame.timer_elapsed_cycles);
cpu_heartbeat_print(&peer_cpu_beat_frame);
}
else
{
log_msg("CPU未收到心跳数据");
}
return ret;
}
void cpu_heartbeat_print(const CpuHeartBeatFrame* frame)
{
frame_head_print(&frame->head);
printf("local_cpu_state :%d\n",frame->local_cpu_state);
printf("relay_state :%d\n",frame->relay_state);
printf("hmi_comm_state :%d\n",frame->hmi_comm_state);
printf("eeu_comm_state :%d\n",frame->eeu_comm_state);
printf("dual_series_comm_state :%d\n",frame->dual_series_comm_state);
printf("switch_comm_state :%d\n",frame->switch_comm_state);
printf("mo_comm_state :%d\n",frame->mo_comm_state);
printf("local_cpu_failure_state :%d\n",frame->local_cpu_failure_state);
printf("local_cpu_interlocking_state:%d\n",frame->local_cpu_interlocking_state);
printf("timer_elapsed_cycles :%d\n",frame->timer_elapsed_cycles);
}
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1 { int a; char b[13]; double c;};
#pragma pack(2)
struct A2 { int a; char b[13]; double c;};
#pragma pack(4)
struct A4 { int a; char b[13]; double c;};
#pragma pack(8)
struct A8 { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
printf("AD.a %d\n",field_offset(AD,a));
printf("AD.b %d\n",field_offset(AD,b));
printf("AD.c %d\n",field_offset(AD,c));
printf("\n");
printf("A1.a %d\n",field_offset(A1,a));
printf("A1.b %d\n",field_offset(A1,b));
printf("A1.c %d\n",field_offset(A1,c));
printf("\n");
printf("A2.a %d\n",field_offset(A2,a));
printf("A2.b %d\n",field_offset(A2,b));
printf("A2.c %d\n",field_offset(A2,c));
printf("\n");
printf("A4.a %d\n",field_offset(A4,a));
printf("A4.b %d\n",field_offset(A4,b));
printf("A4.c %d\n",field_offset(A4,c));
printf("\n");
printf("A8.a %d\n",field_offset(A8,a));
printf("A8.b %d\n",field_offset(A8,b));
printf("A8.c %d\n",field_offset(A8,c));
printf("\n");
printf("A16.a %d\n",field_offset(A16,a));
printf("A16.b %d\n",field_offset(A16,b));
printf("A16.c %d\n",field_offset(A16,c));
printf("\n");
return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//