我有一个以这种方式运行的程序:
过程A ---写 - >全局结构---通过--->进程读取B
而过程B不能得到A曾经写过的东西
使用GDB,我发现了一些奇怪的东西:
任何人都可以解释为什么会这样吗?
答案 0 :(得分:1)
任何人都可以解释为什么会这样吗?
正如您已经发现的那样,这是违反一个定义规则的结果 - 您在程序的不同部分中以不同的方式定义了相同的结构。
特定GDB行为的解释如下:GDB不会急切地解析调试信息,直到需要(它 lazily )。
当您执行第一个print sizeof(struct rte_eth_stats)
时,GDB会找到rte_eth_stats
的第一个定义(它可能已经加载了此定义,具体取决于您在此之前执行的命令)。
执行第二个print sizeof(pstat_dpdk[2])
时,GDB会查找pstat_dpdk
的定义,而这样做会发现{em>第二个定义{ {1}},并更新其结构概念。
当您执行第三个rte_eth_stats
时,GDB使用更新后的print
状态,并打印其" new"大小
如果两个定义的大小不同,GDB可能会在用第二个定义rte_eth_stats
替换第二个定义时打印警告。
但是,这种不同的定义并不少见(例如,库的客户只知道第一个(比方说)3个struct成员,但库本身知道其他(私有)成员),并打印警告在那种情况下会很烦人。
答案 1 :(得分:0)
在你的问题中没有很多细节,但做出一些假设,让我问一下:这两个程序是否针对相同的标题进行编译?
如果用于编译每个程序的头文件不同,则每个程序中的sizeof(struct)可能不同。