谁叫这个功能?

时间:2009-02-12 18:43:17

标签: shell ctags code-search-engine

在我的上一份工作(遗留FORTRAN 77代码)中,我们有交叉引用文件列出了哪些子程序称为其他子程序,在哪些文件子程序中定义,哪些公共块包含哪些变量,哪些子程序包含哪些公共块,等等然后,shell脚本使用了这些脚本,这些脚本会对交叉引用文件进行处理,并会告诉您有关程序设计的信息。

我现在正在一家新公司(C ++代码),我发现ctags可以取代其中的一些功能。我最想念的一件事是我们称之为“who.calls”的命令,它列出了哪些子程序(我的意思是函数或方法,必须习惯于OO说)调用给定的子程序。例如,如果子例程foo调用子例程bar

>who.calls bar
foo

有关如何在不重新设计旧公司编程环境的情况下执行此操作的任何建议?我正在寻找一个超级正则表达式或其他方法,我可以在命令行使用,但我愿意接受其他方法,采取一些完全不同的方法来给我相同的信息。我基本上想要在不运行调试器的情况下发现调试函数堆栈。

5 个答案:

答案 0 :(得分:5)

您可能需要考虑使用doxygen。它可以生成向您显示整个调用树和类结构的网页,以及提取正确格式化的注释以记录类和方法,就像Javadocs为java做的那样。

另一种可能性是开始使用IDE。使用vi(然后是gvim)和ctags 25年后,我最近加入了21世纪并开始使用Eclipse(我正在使用Java,但我已经看过Eclipse的C ++插件)。除了能够执行标记可以执行的所有操作之外,它还可以将您带到当前方法的所有调用方。最重要的是,它内置了一个非常好的交互式调试器。

答案 1 :(得分:4)

要使用命令行,请尝试cscope;它应该能够回答这个问题以及更多:

  
      
  • 允许搜索以下代码:      
        
    • 所有对符号的引用
    •   
    • 全球定义
    •   
    • 函数调用的函数
    •   
    • 调用函数的函数
    •   
    • 文字字符串
    •   
    • 正则表达式
    •   
    • 文件
    •   
    • 包含文件的文件
    •   
  •   

它不是为C ++编写的,但可能能够处理搜索C ++代码库(使用some caveats)。

如果您正在寻找基于Web的界面,请考虑在服务器上运行的OpenGrok并为您的版本控制系统编制索引。它没有您正在寻找的搜索,但它可以通过符号搜索来近似它。

答案 2 :(得分:2)

SlickEdit可以标记项目中的每个符号,包括库,以便在“show references”中显示。它将是who.calls加上一个,其中加号是定义。这是基于来源的。

答案 3 :(得分:1)

GNU Global在基于Unix的系统上完成了我的工作。

答案 4 :(得分:0)

可以找到对语言敏感的源代码搜索引擎 在SD Source Code Search Engine。它可以同时处理多种语言。 可以对特定语言中的模式执行搜索, 或跨语言的模式(例如“查找涉及TAX的标识符”)。 通过对语言令牌敏感,减少了误报的数量, 为用户节省时间。它了解C,C ++,C#,COBOL,Java,ECMAScript,Java,XML,Verilog,VHDL以及许多其他语言,特别是包括FORTRAN。

很容易找到使用此工具在Fortran中调用X的人;只需搜索所有 标识符'X'。您输入的实际查询是:      I = X (“任何名为X的标识符”)。它找到了整个源代码库的所有引用。