Tengo un programa que se ejecuta de tal manera:
proceso A --- escribir -> estructura global --- leer por ---> proceso B
mientras que el proceso B no puede obtener lo que A una vez escrito
Usando GDB, encontré algo extraño como eso: ingrese la descripción de la imagen aquí

¿Alguien puede explicar por qué sucede esto?

c gdb
0
user7870532 8 jul. 2017 a las 08:02

2 respuestas

La mejor respuesta

¿Alguien puede explicar por qué sucede esto?

Como ya ha descubierto, este es el resultado de violar la regla de una definición: tiene la misma estructura definida de manera diferente en diferentes partes de su programa.

El comportamiento específico de GDB se explica así: GDB no ansiosamente analiza la información de depuración hasta que lo necesita (lo hace perezosamente ).

Cuando ejecuta el primer print sizeof(struct rte_eth_stats), GDB encuentra la primera definición de rte_eth_stats (es posible que ya haya cargado esta definición antes, según los comandos que haya ejecutado hasta ese momento).

Cuando ejecuta el segundo print sizeof(pstat_dpdk[2]), GDB busca la definición de pstat_dpdk y al hacerlo descubre la segunda definición de {{X2} }, y actualiza su noción de qué es esa estructura.

Cuando ejecuta el tercer print, GDB usa el estado actualizado de rte_eth_stats e imprime su "nuevo" tamaño.

GDB podría haber impreso una advertencia al reemplazar la primera definición de rte_eth_stats con la segunda si las dos definiciones tienen un tamaño diferente.

Sin embargo, no es raro tener definiciones tan diferentes (por ejemplo, cuando los clientes de una biblioteca solo conocen los primeros (digamos) 3 miembros de la estructura, pero la biblioteca en sí misma conoce los miembros adicionales (privados)), e imprime una advertencia en ese caso sería molesto.

1
Employed Russian 8 jul. 2017 a las 16:44

No hay muchos detalles para continuar en su pregunta, pero haciendo algunas suposiciones, permítame preguntar: ¿Estos dos programas se compilan con los mismos encabezados?

Si los archivos de encabezado utilizados para compilar cada programa son diferentes, el tamaño de (estructura) en cada uno puede ser diferente.

0
jschmerge 8 jul. 2017 a las 05:05