2

有没有办法使用 binutils 工具来获得这个?例如:

// x.cc
typedef long long MyInt;
int main(int argc, char* argv[]) {
  // blah blah blah
}

然后:

g++ -g x.cc -o a.out

如何分析 a.out 以获取 sizeof(MyInt)?GDB 可以做到,但我不想使用 GDB,因为它对于大型二进制文件来说真的很慢。

4

3 回答 3

1

readelf 能够列出 dwarf 调试信息:

readelf -wi

找到 har DW_AT_name 等于 MyInt 并且是代表此编译单元的 DW_TAG_compile_unit 的直接子元素的 DW_TAG_variable 元素。

使用 DW_AT_type 属性查找此变量的 DW_TAG_base_type。DW_AT_type 属性是从存储该类型信息的该 CU 开始的偏移量。这些偏移量列在输出的左侧(在 <>s 中)。查看此 DIE 的 DW_AT_byte_size 属性。这是类型的大小(以字节为单位)。

于 2010-08-14T21:18:41.000 回答
0

我会说你最好坚持使用gdb。

bintuls 主要处理可执行格式 (ELF) - 调试内容以dwarf格式保存。除了运行之外,objdump -g -x yourbinary我还没有看到很多处理调试符号的实用程序。

总而言之,通过 elf 和 dwarf 解析以提取类型是非常可怕且不平凡的——尽管这正是调试器已经完成的工作。

于 2010-04-20T21:46:36.697 回答
0

您将需要做 GDB 正在做的事情并自己阅读 DWARF 调试信息。有几个工具可以帮助解决这个问题,比如 readelf 和 dwarfdump。去http://dwarfstd.org/阅读常见问题解答和其他好东西,看看是否能满足您的需要。

这个答案是假设你在一个普通的 Linux 平台上运行。其他平台的其他工具也可能对您有用,但我不是问这些的人。

于 2010-04-20T21:48:40.383 回答