有没有办法使用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,因为它对于大型二进制文件来说真的很慢。
答案 0 :(得分:1)
readelf能够列出矮人调试信息:
readelf -wi
查找DW_TAG_variable元素,其中DW_AT_name等于MyInt,并且是表示此编译单元的DW_TAG_compile_unit的直接子元素。
使用DW_AT_type属性查找此变量的DW_TAG_base_type。 DW_AT_type属性是从该CU的起点开始的偏移,其中存储有关此类型的信息。这些偏移列在输出的左侧(在<> s中)。 查看此DIE的DW_AT_byte_size属性。这是类型的大小,以字节为单位。
答案 1 :(得分:0)
我会说你最好坚持使用gdb。
bintuls主要处理可执行格式(ELF) - 调试内容以dwarf格式保存。除了运行objdump -g -x yourbinary
之外,我还没有看到很多处理调试符号的实用程序。
总而言之,通过elf和dwarf解析这些类型是非常可怕和非平凡的 - 尽管调试器已经完成了这一点。
答案 2 :(得分:0)
您需要执行GDB正在执行的操作并自行阅读DWARF调试信息。有一些工具可以帮助解决这个问题,比如readelf和dwarfdump。请阅读http://dwarfstd.org/上的常见问题解答和其他好东西,看看是否能满足您的需求。
这个答案假设你在一个普通的Linux平台上运行。还有其他平台的其他工具可能也适合你,但我不是那个问这些的人。