如何检查C ++编译器生成的代码?

时间:2009-12-01 11:45:43

标签: c++ compiler-construction binary

就像在主题中一样 - 是否有任何软件可以打开(什么?),在这里我甚至不知道打开什么 - 文件与目标代码或exe? 我今天的问题(如果只是今天;))可能看起来有些奇怪,但我正在通过B.S.的“C ++编程语言”中的练习。有时我只是坚持特定的问题。我有时会对这本书的风格(在很多方面都很出色)感到有点恼火,他(B.S.)会在他的书中提出一些你无法回答的问题,如何去做,甚至从哪里开始。 比如这个例如:

运行一些测试,看看你的编译器是否真的使用指针生成迭代的等效代码,并使用索引进行迭代。如果可以请求不同程度的优化,请查看是否以及如何影响生成代码的质量。

从第5章问题8开始。到目前为止,本书中没有提到测试和分析编译器生成的代码。 无论如何,如果有人可以帮助我,我会很高兴。 谢谢。

3 个答案:

答案 0 :(得分:5)

调试器会帮助你。大多数调试器都允许您暂停程序并查看反汇编。好消息是,他们指出你正确设置断点的行的反汇编,而不仅仅是所有的编译结果。

有一段时间我在Visual Studio中执行此操作 - 编译程序,将断点放在感兴趣的代码的开头,启动程序,然后在停止时打开反汇编并立即看到与之对应的代码C ++代码。

答案 1 :(得分:2)

如果你正在使用g ++,你可以g++ -S main.cpp。这将在名为main.s的文件中输出程序集。但是,如果您感兴趣的函数分布在不同的.cpp文件中,那么在最终的可执行文件上执行objdump可能会更方便。

还有一个名为embroider的漂亮工具,它可以为你输出objdump输出作为HTML,交换各种函数调用和跳转。

答案 2 :(得分:0)

许多编译器可以生成他们在编译期间生成的汇编代码的“列表”文件,其中散布着来自C源代码的语句。此外,还有一些工具可以反汇编对象和可执行文件。

这些工具实际上是如何激活的,显然取决于你的工具链。