【问题标题】:How to check code generated by C++ compiler?如何检查 C++ 编译器生成的代码?
【发布时间】:2009-12-01 11:45:42
【问题描述】:

就像在主题中一样 - 是否有任何软件可以打开(什么?)而在这里我什至不知道要打开什么 - 带有目标代码或 exe 的文件? 我今天的问题(如果只是今天的话 ;))可能看起来有点奇怪,但我正在经历 B.S. 的“C++ 编程语言”中的练习。有时我只是被困在特定的问题上。我有时对这本书的风格(在许多方面都很出色)有点恼火,因为他(B.S.)提出了一些你在他的书中找不到的关于如何去做甚至从哪里开始的问题。 比如这个:

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

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

【问题讨论】:

    标签: c++ compiler-construction binary


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。以及为什么这里的 cmets 必须至少有 15 个字符长。我只是想说声谢谢,但不,它不会让我这样做。可惜!!!!
    • +1。编程新手并不总是意识到调试器的用处,尤其是在还在学习编程的时候。
    【解决方案2】:

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

    还有一个名为embroider 的好工具,它可以将 objdump 输出漂亮地打印为 HTML,交叉链接各种函数调用和跳转。

    【讨论】:

      【解决方案3】:

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

      这些工具的实际激活方式显然取决于您的工具链。

      【讨论】:

        猜你喜欢
        • 2021-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        • 2020-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多