我正在为旧博客文章中的第一个问题寻找一个很好的 Stack Overflow 风格答案 C++ 代码大小, ,我将在下面重复:

我真的很想要一些工具(最好是基于 g++)来显示编译/链接代码的哪些部分是从 C++ 源代码的哪些部分生成的。例如,查看是否正在为数百种不同类型实例化特定模板(可通过模板专门化修复),或者代码是否被过度内联,或者特定函数是否大于预期。

有帮助吗?

解决方案

它似乎像这样的事情应该存在的,但是我没有用过这样的事情。我可以告诉你我怎么会去了解这个脚本一起,虽然。可能有更快和/或性感的方式去做。

首先,一些东西,你可能已经知道:

在addr2line命令取入的地址和可以告诉你的源代码的机器代码有器具。该可执行文件需要与调试符号被建造。你可能不希望多进行优化(-O0,-O1,或者-Os可能高达你想要去的第一个反正)。 addr2line有几个标志,你会想阅读它的手册页,但你肯定会需要使用-C或--demangle如果你想看到C ++函数名,在输出是有意义的。

在objdump的命令可以打印出各种有趣的事情大约在许多类型的目标文件的东西。的事情之一它能做的就是打印出表示所述符号或由对象文件(包括可执行文件)参照的表。

现在,你想要什么是做些什么:

什么你会想是从objdump告诉你.text段的地址和大小。这是实际可执行的机器代码住在哪里。有几种方法可以做到这一点,但最简单的(对于这一点,反正)可能是为你做:

objdump -h my_exe | grep text

这应该导致类似:

 12  .text       0000049  000000f000  0000000f000 00000400  2**4

如果你没有用grep它,它会给你像一个标题:

Idx  Name        Size     VMA         LMA         File off  Algn

我觉得可执行文件的VMA和LMA应该是相同的,所以它不会不管你使用哪一个,但我认为LMA是最好的。您还需要大小。

通过在LMA与尺寸可以反复调用addr2line要求的机器代码的源代码原点。我不知道怎么样,如果你通过了为一个指令中的地址,这将工作,但我认为它应该工作。

addr2line -e my_exe <address>

从这个输出将是一个路径/文件名,冒号和一个行号。 如果你要统计每个独特的路径/文件的发生:NUM你应该能够看到具有最高计数的人。 的Perl 散列使用路径/文件:NUM作为密钥和一个计数器作为值将是如果您发现运行速度太慢一种简单的方法来实现这一点,虽然有更快的方式。 你也可以过滤掉的东西,你可以决定并不需要及早包括在内。 为了显示你的输出,你可能希望从相同功能的过滤掉不同的线路,但中的一个功能有不同的数量,这可能是有趣的,你可能会注意到不同的线路。无论如何,这可以借将addr2line告诉你函数名或第一个步骤和工作一个函数在一个时间可以使用objdump -t完成。

如果你看到一些模板代码或其他代码行更频繁地显示在你的可执行文件比你认为他们应该那么你可以很容易地找到他们,并有一探究竟。宏和内联函数可以示出端向上显现出来不同于预期值。

如果你不知道,objdump的和addr2line来自 GNU binutils的包,其中包括其他一些有用的工具。

其他提示

如果你正在寻找找到你的C ++代码代码膨胀的来源,我用“纳米”来表示。以下命令将列出在顶部最大的代码和数据块的应用,该符号:

nm --demangle --print-size --size-sort --reverse-sort <executable_or_lib_name> | less

我最近写了一个工具, 膨胀指责, ,它的作用类似于 内特古斯提议.

我不知道这是否会帮助,但有一个GCC标志写它产生为您检查一个文本文件的汇编代码。

“的 -S     用于代替-c以引起对象文件,而不是要生成的汇编源文件,使用.S作为扩展。如果你需要检查生成的汇编代码,这可能是有用的。 “

在大多数C编译器有以生成.map文件的一种方法。该文件列出了所有的编译库的他们的地址和它们的大小。您可以使用地图文件来帮助你确定哪些文件,你应该寻找第一个优化。

我不知道如何映射代码 - >组件中一般生成。

有关模板实例,你可以使用类似“弦-a | grep的|排序-u | GC ++ filt的。”得到的精选正在创建什么画面粗糙

您提到的另外两个项目似乎很实际主观的。什么是“太多了”内联?你是否担心你的二进制文件是越来越膨胀?这样做的唯一的事情居然还有进入GDB和拆卸呼叫者看到它产生的是什么,什么检查一般“过度”内联。

有关功能的大小,再次我很好奇,为什么它很重要?你们是不是在编译时发现代码意外扩大?你怎么连定义的预期大小是什么样的工具来检查?同样,你可以随时拆卸您怀疑编译比你要多得多代码的任何功能,看看到底是什么编译器正在做什么。

在Visual C ++,这基本上是什么.PDB文件用于

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top