我有一个程序以这样的方式运行:
进程A---写入-->全局结构---读取者--->进程B
而进程 B 无法获取 A 曾经编写的内容
使用 GDB,我发现了一些奇怪的东西:
谁能解释一下为什么会发生这种情况?
最佳答案
Can any one explain why this happen?
正如您已经发现的,这是违反单一定义规则的结果 - 您在程序的不同部分以不同的方式定义了相同的结构。
具体的 GDB 行为解释如下:GDB 在需要之前不会急切解析调试信息(它懒惰这样做)。
当您执行第一个 print sizeof(struct rte_eth_stats)
时,GDB 会找到 rte_eth_stats
的第一个定义(它可能已经提前加载了该定义,具体取决于您执行的命令)已执行到该点)。
当您执行第二个 print sizeof(pstat_dpdk[2])
时,GDB 会查找 pstat_dpdk
的定义,并这样做发现rte_eth_stats
的第二定义,并更新该结构的概念。
当您执行第三次print
时,GDB使用rte_eth_stats
的更新状态,并打印其"new"大小。
如果两个定义的大小不同,则在用第二个定义替换 rte_eth_stats 的第一个定义时,GDB 可能会打印警告。
但是,具有此类不同定义的情况并不少见(例如,库的客户端仅了解结构体的前(例如)3个成员,但库本身了解其他(私有(private))成员),并打印警告在这种情况下会很烦人。
关于c - 命令运行两次时 gdb 得到不同的结构大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44982698/