有没有办法找到c程序中使用的所有函数?

有没有办法找到c程序中使用的所有函数?,c,function,system-calls,ltrace,C,Function,System Calls,Ltrace,我有一个带有多个文件的大型夸张c程序的源代码。我希望有没有办法找到程序中声明和调用的所有标准函数和内置函数。我知道我可以使用诸如ltrace和strace之类的工具编译它并跟踪函数和系统调用,方法是首先将输出重定向到文件,然后使用grep选择函数调用。或者我可以在所有文件上使用shell上的正则表达式,但我还不知道正则表达式。那么,有谁知道一个工具可以帮助我快速找到c程序中调用和声明的所有函数吗?检查这是否有帮助,代码中的注释: !/bin/bash 对于当前路径中的每个.c递归 以$find表

我有一个带有多个文件的大型夸张c程序的源代码。我希望有没有办法找到程序中声明和调用的所有标准函数和内置函数。我知道我可以使用诸如ltrace和strace之类的工具编译它并跟踪函数和系统调用,方法是首先将输出重定向到文件,然后使用grep选择函数调用。或者我可以在所有文件上使用shell上的正则表达式,但我还不知道正则表达式。那么,有谁知道一个工具可以帮助我快速找到c程序中调用和声明的所有函数吗?

检查这是否有帮助,代码中的注释:

!/bin/bash 对于当前路径中的每个.c递归 以$find表示f-名称“*.c”;做 使用辅助信息提取功能和his位置 将结果发送到output.info 将错误发送到/dev/null gcc-aux info output.info$f 2>/dev/null 从output.info中提取函数名,不包括std头和注释 grep-Ev/usr |根据output.info编译 完成 删除output.info rm output.info 由于您似乎正试图按照以下模式提取自己的代码:type functionparams,因此可以避免使用gcc-aux info,请尝试以下操作:

!/bin/bash 对于当前路径中的每个.c递归 以$find表示f-名称“*.c”;做 提取以字母或下划线开头的行 并以或“{”或“}”结尾,忽略尾随空格 grep-带文件名-行号-颜色“^[a-z | a-z | | |].[|{|}]$”$f 完成
因为函数指针,不,没有。考虑这个程序:

#include <dlfcn.h>

int main(int argc, char **argv) {
    void *handle = dlopen(argv[1], RTLD_LAZY);
    void (*f)(void) = dlsym(handle, argv[2]);
    f();
    dlclose(handle);
}

很明显,您不可能希望列出它可以调用的所有函数。

@David给了我一个很好的答案,但在bash中学习了for循环之后,我想出了一个方法,就消息而言,这个方法稍微干净一些。这个方法最好的地方是它静态地扫描文件,这意味着即使一些函数被分配给@joseph所指的指针,你也可以看到所有函数调用的列表。这个程序的输出并不像它可能的那样干净,因为我不太懂正则表达式,所以如果有人知道更好的方法,别忘了清理它

#!/bin/bash

#go through each .c file in the directory
for f in $(find . -maxdepth 1 -name "*.c");do
    #print the name of the file
    echo "$f"
    #print the content of the file
    #and then choose the lines that contain function calls
    cat -n $f|grep -v "if\|else\|for\|while\|return"| grep --color=always "_*(\|[[:alpha:]]*("

done

只要nm就足够了。好的,非常感谢你,我放弃了那个@卡米尔库克,我应该删除这个问题吗?但是我怎么知道它们在哪里被使用过呢?我的确切意思是哪一行和哪一个文件?@ehm:你的问题中没有问这个问题。:-你可以试试CTAG。out有点笨重,但它给了我一个很好的启示谢谢你帮我完善我在下面写的脚本哦,我明白了,不使用-gcc aux info提取函数名是非常困难的,如果函数是这样写的:?好的,我明白了,试着写一个脚本就像写我自己的lexer一样,但是,假设在代码中使用了像nameparams那样编写函数名的样式,因为在我的例子中是这样,那么有更好的方法吗?Noobie真烦人!对不起,你听说过强氧吗?非常容易使用,它可以做你想做的事情,还有更多,几分钟前我在我的github中的一个项目中上传了一个文件,向你展示了它的工作原理,下载这个repo:并在游戏文件夹中检查doxygen.cfg,通过2到3个步骤,你会得到非常好的结果,将doxygen.cfg文件中的OUTPUT\u LANGUAGE=Spanish替换为OUTPUT\u LANGUAGE=English,但是如果我使用的程序正在静态读取代码,它将无法找到所有函数调用。我的答案中有一个编辑,请检查是否有帮助,我用itOk获得了很好的结果,这看起来非常好,非常感谢,但是它并没有得到像exit这样被调用的函数,但是我会改变正则表达式,谢谢你给我看方向,我完全误解了这个问题,我以为你只是想要函数名,恐怕你无法避免使用像ctags这样的解析器