c - 命令运行两次时 gdb 得到不同的结构大小

标签 c gdb

我有一个程序以这样的方式运行:
进程A---写入-->全局结构---读取者--->进程B
而进程 B 无法获取 A 曾经编写的内容
使用 GDB,我发现了一些奇怪的东西: enter image description here

谁能解释一下为什么会发生这种情况?

最佳答案

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/

相关文章:

c - 如何将执行命令从 bash 脚本翻译成 C?或者如何在 "W"模式下正确使用 popen()?

c++ - 错误 : double free or corruption (out): 0x00007fffffffddf0 ***

c - fgets() 在 main() 之外表现出意外

c - 结构体中指向结构体动态数组 C 的指针

c++ - 使用 GDB 进入模板类

c - 调试符号是什么样的?

c - 递归函数多个返回值

debugging - gdb:找不到新线程:一般错误

c - 如果给定值小于当前值,则更新线段树

c - 在 C 中解析程序参数时有什么好的做法