谁调用这个函数?

发布于 2024-07-13 09:49:07 字数 516 浏览 10 评论 0原文

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

我现在在一家新公司(C++ 代码),并且我发现 ctags 可以替代部分功能。 我最怀念的一件事是我们称为“who.calls”的命令,它列出了哪些子例程(我的意思是函数或方法,必须习惯 OO 语言)调用给定的子例程。 例如,如果子例程 foo 调用子例程 bar

>who.calls bar
foo

对于如何在不重新设计我原来公司的编程环境的情况下执行此操作有什么建议吗? 我正在寻找一个超级正则表达式或一些可以在命令行使用的其他方法,但我对其他方法持开放态度,这些方法采用一些完全不同的方法来为我提供相同的信息。 我基本上想在不运行调试器的情况下发现调试函数堆栈。

At my last job (legacy FORTRAN 77 code), we had files of cross references that list what subroutines called other subroutines, in what files subroutines were defined, what common blocks held what variables, what subroutines included what common blocks, etc. These were then used by shell scripts that grepped the cross reference files and would tell you things about the design of the program.

I'm now at a new company (C++ code), and I've found ctags to replace some of that functionality. The one thing I miss the most is a command we called "who.calls" that lists what subroutines (I mean functions or methods, gotta get used to the OO-speak) call a given subroutine. For example, if the subroutine foo calls the subroutine bar:

>who.calls bar
foo

Any suggestions for how to do this without re-engineering the programming environment from my old company? I'm looking for a super regex or some other method that I can use at the command line, but I'm open to other methods that take some totally different approach to give me the same information. I basically want to discover a debug function stack without running the debugger.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

神经大条 2024-07-20 09:49:07

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

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

You might want to consider using doxygen. It can produce web pages that show you the entire call tree and class structure, as well as pulling out properly formatted comments to document the classes and methods just like Javadocs do for java.

Another possibility is to start using an IDE. After 25 years of using vi (and then gvim) and ctags, I've recently joined the 21st century and started using Eclipse (I'm doing Java, but I've seen C++ plugins for Eclipse). As well as being able to do everything that tags can do, it can also take you to all the callers of the current method. And on top of that, it has a damn good interactive debugger built in.

香草可樂 2024-07-20 09:49:07

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

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

它不是为 C++ 编写的,但可能能够处理搜索 C++ 代码库(使用 < a href="http://cscope.sourceforge.net/cscope_man_page.html" rel="nofollow noreferrer">一些注意事项)。

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

For command line use, try cscope; it should be able to answer this question and more:

  • Allows searching code for:
    • all references to a symbol
    • global definitions
    • functions called by a function
    • functions calling a function
    • text string
    • regular expression pattern
    • a file
    • files including a file

it is not written for C++ but may be able to handle searching a C++ codebase (with some caveats).

If you are looking for a web-based interface, consider OpenGrok which runs on a server and indexes your revision control system. It doesn't have the search you are looking for in particular, but it can approximate it with a symbol search.

旧时光的容颜 2024-07-20 09:49:07

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

SlickEdit can tag every symbol in your project, including libraries, for display in "show references." It will be who.calls plus one, where the plus one is the definition. It's source based.

掀纱窥君容 2024-07-20 09:49:07

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

GNU Global does the job for me on Unix based systems.

输什么也不输骨气 2024-07-20 09:49:07

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

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

A langauge-sensitive source code search engine can be found
at SD Source Code Search Engine. It can handle many languages at the same time.
Searches can be performed for patterns in a specific langauge,
or patterns across languages (such as "find identifiers involving TAX").
By being sensitive to langauge tokens, the number of false positives is reduced,
saving time for the user. It understands C, C++, C#, COBOL, Java, ECMAScript, Java, XML, Verilog, VHDL, and a number of other languages, specifically including FORTRAN.

Its easy to find who calls X in Fortran with this tool; simply search for all
identifiers 'X'. The actual query you have type is this:
I=X
("any identifier named X"). That finds all references across the entire souce code base.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文