【问题标题】:Extending functionalitty (aka Modifying) visual studio C/C++ compiler扩展功能(又名修改)Visual Studio C/C++ 编译器
【发布时间】:2012-12-10 17:20:07
【问题描述】:

我想扩展 Visual Studio 中使用的 C/C++ 编译器的功能。基本上,我想编写一个工具来解析 c/c++ 代码并打印出所有分支(if check、break 语句、for/while 循环等)在代码中发生的位置。然后我想在执行代码时使用这些信息来灰掉给定测试用例尚未执行的代码区域。

有可能吗? Microsoft 是否提供任何方法来为其编译器/调试器添加功能?

--谢谢

【问题讨论】:

  • 感谢所有回答。虽然他们都很好,但我不能投票,因为我没有足够的声誉:(

标签: c++ c visual-studio-2010 visual-studio compiler-construction


【解决方案1】:

Microsoft 的编译器始终是一个黑匣子。 (取自他们自己的网站,来自即将发布的链接)。所以你有机会现在不可能。但随着项目Roslyn 即将改变。

无论如何,在我看来,您不应该查看编译器,而是查看 Visual Studio 的调试部分。 APIs 允许您与调试器进行交互,这可能是您想要走的路(其他人也确实走)。

【讨论】:

  • 我不确定我是否同意调试器比编译器更好地理解源代码中的分支点在哪里。我不相信调试器“知道”这类事情,因此您必须通过在生成的二进制文件中查找分支来对信息进行逆向工程,然后查找源中所属的位置。我要补充一点,这绝对不是一个简单/小任务——即使你有编译器的源代码! [不是说理解编译器代码也很容易!]
  • @Sascha,我看了一下 Roslyn 和你提到的 API。虽然 Roslyn 对我的需求没有用处,但这些 API 与 Clifford 提到的类似内容相结合可能会解决我的问题。
  • @Sascha,我查看了 API,就这个问题而言,它们似乎支持一些与断点相关的功能。如果调试器(以某种方式)提供有关分支的信息,那么我不需要查看编译器部分。
  • @Mats Peterrson,我同意这个困难。我的日常工作是编译器!但是,看起来像其他答案中建议的一些解决方法
【解决方案2】:

您通常不会通过修改编译器来做到这一点,而使用 Microsoft 的编译器则无论如何都做不到。相反,您应该编写一个预处理器来检测代码(在条件节点处插入额外的代码以跟踪控制流),然后编写一个工具来处理跟踪数据以确定运行的内容。

Visual Studio 本身有an add-in architecture,它允许您以您描述的方式在编辑器中呈现这些数据。

检测本身并非微不足道 - 它需要能够解析所有有效的 C 和 C++ 代码,并能够保留原始行号信息,以便呈现未检测的代码。为了完整起见,它必须能够使用三元 ?: 运算符重构代码,以便可以检测其流程。检测后的代码还需要是标准预处理器输出的代码,而不是原始源代码——这使得行号跟踪更加困难(尽管预处理器已经管理了它以供调试器使用)。

【讨论】:

  • 谢谢。我认为预处理器和 APIS 的组合会有所帮助。我确实理解这个问题的完整性可能很困难,但即使我能做到 50%,我的工作效率也会提高!
  • @user763410:请注意,Visual Studio Ultimate 和 Premium 版本已经包含 Code Coverage Analysis。使用它可能比自己编写代码更具成本效益。有许多第三方工具可能适合您的需求。
【解决方案3】:

使用预处理器来检测代码。代码在运行时应该吐出一个文件。在断点处,使用调试器 API + Visual Studio 插件机制处理此信息和“灰显”代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多