我有一个遗留的C代码集合,我正在重构,以便从GUI中分离出C计算代码.由于重度递归的数学核心代码是K&R样式声明,这很复杂.由于嵌套使用了函数参数,我已经放弃了将这些转换为ANSI声明的尝试(只是无法获得最后4个编译器错误).
我需要将一些文件移动到一个纯DLL中,并确定要公开的最小接口,这需要编写包装函数来发布一个类型化的接口.
我已经使用Doxygen @callergraph标记标记了关键源文件,因此为各个函数生成了信息图.除此之外我想做的是合并这些图,这样我就可以确定暴露于外部世界的最窄函数边界.
原始头文件没有用 - 它们将所有内容公开为非类型化C函数.
有数百个函数如此简单地检查生成的调用程序图是很痛苦的.
我正在考虑编写某种DOT合并工具 - 设置DOT_CLEANUP = NO使Doxygen离开中间的DOT文件而不是保留他们生成的png文件.
我并不痴迷于这是一个图形解决方案 - 如果有人能够建议使用Doxygen的XML输出来实现相同目标的替代分析工具(免费或相对便宜)或技术,我会很高兴.
在文件级别合并的调用图确实对客户端文档有一定的吸引力,而不是简单的列表:-)
对于给定的方法(例如 Settings.cpp getSettingByName()),我想获得调用图的文本表示。我听说 doxygen 可以生成调用图的图像,我对文本输出更感兴趣。
例如,如果我给它“Settings.cpp getMethodByName”它会返回:
Settings.cpp getSettingByName();
SettingsWrapper.cpp getMaximumSpeed();
ECU.cpp monitorSpeed();
Operate.cpp runECU();
Main.cpp run();
CruiseControl.cpp accelerate();
Operate.cpp runCruiseControl();
Main.cpp run();
Radio.cpp playApplauseThroughSpeakers();
Operate.cpp runStereo();
Main.cpp run();
Run Code Online (Sandbox Code Playgroud)
这可能吗?
非常感谢,菲德尔
附:不要害怕代码,这只是一个例子。
是否有任何工具,免费或商业,可以为C#方法生成流可视化图形?它应该能够处理决策点(可能将它们表示为顶点)和顺序代码片段(可能将它们表示为边缘).我知道有类似的C/C++和Java相关的问题,但我对C#感兴趣.
我想分析一个OCaml/Reason代码库并理解各种函数之间的调用.有没有提供此类功能的工具?
我有一堆Perl脚本和Perl模块由某人给我.我有一个驱动程序来测试所有这些脚本和模块.我想生成一个调用图并查看流程.
Perl有没有可用的东西呢?
我喜欢像pycallgraph(对于python)这样的东西.我在AIX中运行所有这些.
我必须重构并维护一堆看起来很糟糕的Java类.许多人具有以下实施模式
class Machine {
public int advance(int state) {
switch(state) {
case 7: return step_7();
case 13: return step_13();
case 4: return step_4();
}
}
private int step_7() {
if(something) return 13; else return 4;
}
private int step_13() {
...
return 4;
}
private int step_4() {
if(miep) return 7;
...
return 13;
}
}
Run Code Online (Sandbox Code Playgroud)
从这里我想生成一个图形(与Graphviz和dot) - 一种"静态调用图",但不完全.
我在这里游戏如何自动执行此操作,除了使用Perl或Python自己解析Java代码.
我真正喜欢的是有一个抽象语法树(AST)或类似我可以浏览的类,同时打印dot-code.
gprof想到这里).L3-misses我使用以下命令在简单的基准测试中提取导致用户级别的回溯evince:
sudo perf record -d --call-graph dwarf -c 10000 -e mem_load_uops_retired.l3_miss:uppp /opt/evince-3.28.4/bin/evince
Run Code Online (Sandbox Code Playgroud)
很明显,采样周期相当大(连续采样之间有 10000 个事件)。对于这个实验, 的输出perf script有一些与此类似的样本:
EvJobScheduler 27529 26441.375932: 10000 mem_load_uops_retired.l3_miss:uppp: 7fffcd5d8ec0 5080022 N/A|SNP N/A|TLB N/A|LCK N/A
7ffff17bec7f bits_image_fetch_separable_convolution_affine+0x2df (inlined)
7ffff17bec7f bits_image_fetch_separable_convolution_affine_pad_x8r8g8b8+0x2df (/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.34.0)
7ffff17d1fd1 general_composite_rect+0x301 (/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.34.0)
ffffffffffffffff [unknown] ([unknown])
Run Code Online (Sandbox Code Playgroud)
在回溯的底部,有一个名为 的符号[unknown],看起来没问题。但随后就呼叫了线路general_composite_rect()。这个回溯OK吗?
AFAIK,回溯中的第一个调用者应该是类似_start()或 的东西__GI___clone()。但回溯不是这种形式。怎么了?
有什么办法可以解决这个问题吗?截断的(部分)回溯可靠吗?
我发现很多程序,例如Doxygen或gprof可以使用外部可视化工具(例如graphviz.
不幸的是,这些程序需要大量的初始配置,我只想知道使用malloc.
该项目很大,有数百个文件和某个main功能。
我目前需要一些时间的解决方案是编写一个 Perl/Python 脚本:
malloc\s*(.*?)来电。这里有一些实用程序可以帮助我吗?
该项目在 Microsoft VisualStudio 2010 上,并生成 dll 作为嵌入式设备的 API。外部库的使用量不是很大。我们使用常用的库,例如 ftdi 或 wdapi910
I generate a call graph of a complex MATLAB system, and I want to know which functions are built-in and mark them.