【问题标题】:Source file for a function definition函数定义的源文件
【发布时间】:2015-09-27 13:26:19
【问题描述】:

我正在为一个部署在 Unix(HP-UX) 上的非常复杂的应用程序工作,该应用程序的 C/C++ 源文件数>10-15k。 我想知道我是否可以搜索具有特定用户定义函数定义的确切文件名。有很多这样的函数从几个地方调用,使用 grep 搜索需要时间。

我在其他线程中发现了关于 Cscope,ack 的讨论,但这些在我的客户端计算机上不可用。那么还有其他方法可以实现吗?任何建议都会有很大帮助!

另外,我如何在 vi 编辑器中标记一个函数,这有助于在另一个具有其定义的文件中移动?我知道它可以使用 ctags(Ctrl + [) 来实现。有没有其他办法?

如果存在相关线程,请发布。谢谢。

【问题讨论】:

  • 使用nm 列出目标文件中的所有符号,使用sed 删除未定义的符号,然后在收集的输出上使用grep 查找哪个目标文件定义了哪个符号。
  • 另外,这是 C 还是 C++ 源代码?可能有一些工具适用于其中一种,但不适用于另一种。
  • C 中的模块很少,但 C++ 中的新模块。
  • 使用 grep 搜索需要多少时间?我希望不到一秒钟,不是吗?
  • 虽然我不关心时间,但它也会列出所有调用函数的文件,并且由于代码格式不同,我正在寻找一个建设性的解决方案。

标签: c++ c unix hp-ux


【解决方案1】:

如果您无法在开发机器上安装新工具,您可以使用两种通用方法。

文本搜索

您已经提到使用grep,但表示需要时间来筛选结果,因为调用站点与定义一起出现。为避免这种情况,您可以调整 grep 模式。首先,尝试仅 grepping 头文件:

find PATH -name '*.h' | xargs grep FUNC

如果您的项目遵循惯例,每当您发现在头文件中声明的函数时,它将在同一文件中或在相应命名的代码文件中定义。

或者,尝试使用特殊模式仅查找定义:

grep 'FUNC(.*) *$'

这将仅匹配右括号位于行尾的那些位置(模空格)。这将过滤掉大多数调用站点和声明,尽管它并不完美。

对象代码搜索

在这种方法中,您首先生成在每个目标文件中定义的符号列表。这假设您拥有或可以生成这些中间构建工件,并且再次假设您的项目遵循惯例。您将使用nm,详细信息如下:How I can find function in shared object files using objdump and bash functions in linux?

您可以在.bashrc 中为上述命令设置别名,以使其更易于使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多