`
haoningabc
  • 浏览: 1478314 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

graphviz绘制nginx函数调用图

阅读更多
以下是c的版本
c++代码去 http://www.cnblogs.com/lanxuezaipiao/p/3450201.html
codeviz似乎只能支持gcc4.6,好久没更新了,
看这个
https://github.com/Cheukyin/CodeSnippet/tree/master/python/SRCGraphviz/



目标建立 nginx的运行流程
参考
https://www.ibm.com/developerworks/cn/linux/l-graphvis/
参考《深入剖析nginx》
javascript生成绘制.dot
参考
http://stackoverflow.com/questions/6344318/pure-javascript-graphviz-equivalent/14866384
参考
http://graphviz.org/content/cluster
my_debug.h
#ifndef MY_DEBUG_LENKY_H                                                                                                                                                
#define MY_DEBUG_LENKY_H
#include <stdio.h>
void enable_my_debug( void ) __attribute__((no_instrument_function));
void disable_my_debug( void ) __attribute__((no_instrument_function));
int get_my_debug_flag( void ) __attribute__((no_instrument_function));
void set_my_debug_flag( int ) __attribute__((no_instrument_function));
void main_constructor( void  ) __attribute__((no_instrument_function,constructor));
void main_destructor( void  ) __attribute__((no_instrument_function,destructor));
void __cyg_profile_func_enter( void *,void *  ) __attribute__((no_instrument_function));
void __cyg_profile_func_exit( void *,void *  ) __attribute__((no_instrument_function));

#ifndef MY_DEBUG_MAIN
extern FILE *my_debug_fd;
#else
FILE *my_debug_fd;
#endif
#endif

my_debug.c
#include <stdio.h>
#include <stdlib.h>

/* Function prototypes with attributes */
void main_constructor( void )
    __attribute__ ((no_instrument_function, constructor));

void main_destructor( void )
    __attribute__ ((no_instrument_function, destructor));

void __cyg_profile_func_enter( void *, void * ) 
    __attribute__ ((no_instrument_function));

void __cyg_profile_func_exit( void *, void * ) 
    __attribute__ ((no_instrument_function));


static FILE *fp;


void main_constructor( void )
{
  fp = fopen( "/usr/local/nginx_sendfile/sbin/trace.txt", "w" );
  if (fp == NULL) exit(-1);
}


void main_deconstructor( void )
{
  fclose( fp );
}


void __cyg_profile_func_enter( void *this, void *callsite )
{
  fprintf(fp, "E%p\n", (int *)this);
}


void __cyg_profile_func_exit( void *this, void *callsite )
{
  fprintf(fp, "X%p\n", (int *)this);
}

把my_debug.c和my_debug.h放到nginx的src/core/目录下
./configure后修改ojbs/Makefile文件
CFLAGS =  -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g3 -finstrument-functions
...
18 CORE_DEPS = src/core/nginx.h \
19     src/core/my_debug.h \ 
.....
  84 HTTP_DEPS = src/http/ngx_http.h \
  85     src/core/my_debug.h \
....

 105 objs/nginx: objs/src/core/nginx.o \
 106     objs/src/core/my_debug.o \  
......
 216     $(LINK) -o objs/nginx \
 217     objs/src/core/nginx.o \
 218     objs/src/core/my_debug.o \ 
......
 329 modules:

 331 objs/src/core/my_debug.o:   $(CORE_DEPS) src/core/my_debug.c                                                                                                       
 332     $(CC) -c $(CFLAGS) $(CORE_INCS) \
 333         -o objs/src/core/my_debug.o \
 334         src/core/my_debug.c


make&&make install后
启动nginx,生成
/usr/local/nginx/sbin/trace.txt
文件类似
[root@haoning sbin]# head trace.txt 
E0x403f88
E0x41f5ac
X0x41f5ac
E0x403f88
X0x403f88
E0x410425
E0x40ff83
E0x40fa71
X0x40fa71
E0x40ad4b

可以addr2line 40ad4b -e nginx -f
查看地址对应的函数名
使用
https://www.ibm.com/developerworks/cn/linux/l-graphvis/
中的pvtrace
修改代码
symbols.h 中的
 13 #define MAX_FUNCTIONS       20000
 14 #define MAX_FUNCTION_NAME   5000 

否函数太多会报错
stack.c里面也有个改成

#define MAX_ELEMENTS    500

pvtrace nginx
会得到
graph.dot
dot -Tpng graph.dot -o graph.png
如果.dot文件有??则是地址没识别出来,
就一两个,删除即可
也可以生成jpg,
这个.dot也可以用

生成svg的图
根据dot的格式生成svg图的js为

<html>
<head>
    <meta charset="utf-8">
    <title>Viz.js</title>
</head>
<body>
<script type="text/vnd.graphviz"  id="cluster">
digraph G {
	subgraph cluster_0 {
		style=filled;
		color=lightgrey;
		node [style=filled,color=white];
		a0 -> a1 -> a2 -> a3;
		label = "process #1";
	}
	subgraph cluster_1 {
		node [style=filled];
		b0 -> b1 -> b2 -> b3;
		label = "process #2";
		color=blue
	}
	start -> a0;
	start -> b0;
	a1 -> b3;
	b2 -> a3;
	a3 -> a0;
	a3 -> end;
	b3 -> end;
	start [shape=Mdiamond];
	end [shape=Msquare];
}
</script>
  <script src="viz.js"></script>
  <script>
      function inspect(s) {
        return "<pre>" + s.replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\"/g, "&quot;") + "</pre>"
      }
      function src(id) {
        return document.getElementById(id).innerHTML;
      }
      function example(id, format, engine) {
        var result;
        try {
          result = Viz(src(id), format, engine);
          if (format === "svg")
            return result;
          else
            return inspect(result);
        } catch(e) {
          return inspect(e.toString());
        }
      }
      document.body.innerHTML += "<h1>Cluster (svg output)</h1>";
      document.body.innerHTML += example("cluster", "svg");
      </script>
</body>
</html>

结果如图

2017.8.15 nginx-1.13.4


附件中
graph.dot.jpg 下载后改成graph.dot用文本打开可以看到dot文件内容

nginx.conf前面要加上
master_process off;
  • 大小: 3.6 MB
  • 大小: 4.9 MB
分享到:
评论

相关推荐

    Ubuntu1804 源码阅读神器,egypt+graphviz 图形化显示函数调用关系(超详细+图文并茂)

    看源码的时候,心血来潮想弄一下函数之前的调用关系,想起以前doxygen配合graphviz使用可以生成比较直观的函数调用关系图,但是前提是函数的注释需要严格按照doxygen的规范,具体可以自己去搜索一下,当然使用source ...

    C++自动生成函数调用关系图.rar

    6. **Graphviz**:Graphviz是一个开源图形渲染库,用于绘制各种图表,包括函数调用图。开发者可以通过定义图的结构,然后用Graphviz生成图形。 7. **代码分析**:自动生成函数调用关系图的工具通常会分析源代码的...

    Windows平台下Doxygen+GraphViz+HtmlHelp自动生成函数调用关系图.pdf

    Graphviz是一个图形可视化软件,它可以用来绘制各种图形,例如函数调用关系图。HtmlHelp是一个帮助文件生成器,可以将生成的文档转换为HTML格式,方便在网页上查看。 首先,文档指出在安装Doxygen、Graphviz和...

    决策树绘制graphviz

    这段代码将决策树模型转换为DOT语言,并使用Graphviz的`Source`类创建一个图对象,最后调用`view`方法在默认的图形查看器中显示决策树。 标签"机器学习 决策树"表明了这个主题的核心内容,即如何在机器学习项目中...

    自动生成函数调用关系图

    自动生成c++函数调用关系图,里面包含了所有要用到的软件,一站式服务; 通过本人亲测的使用总结; 还有使用到的配置文件(c++的),实在不会配置可以直接使用; 改一改配置文件,应该还可以生成c,java,c#语言的调用...

    kingraph使用JavaScript和Graphviz绘制家族树

    Kingraph是一款基于JavaScript和Graphviz的库,专用于创建和展示家族树或其他关系图。它结合了两种技术的优势,提供了一种动态、交互式的可视化解决方案。在这个项目中,我们将深入探讨如何利用Kingraph来绘制家族树...

    用doxygen+graphviz自动化生成函数调用流程图文件配置

    用doxygen+graphviz自动化生成函数调用流程图文件配置

    函数调用分析工具egypt

    调用图以节点(函数)和边(调用关系)的形式展示,每个节点表示一个函数,每条边表示一个函数调用另一个函数的动作。 三、egypt的使用步骤 1. 安装与配置:下载egypt-1.10压缩包,解压后根据提供的README文件进行...

    demo_通过graphviz绘制二叉树.zip

    《使用Graphviz绘制二叉树详解》 在计算机科学领域,二叉树是一种常见的数据结构,它被广泛应用于各种算法和问题解决中。为了更好地理解和分析二叉树,可视化工具显得尤为重要。Graphviz是一个强大的开源图形渲染库...

    graphviz 函数 流程

    通过以上步骤,你可以在C#程序中使用Graphviz来绘制函数流程图。需要注意的是,Graphviz支持多种布局算法,如`dot`、`neato`、`circo`等,可以根据需求选择合适的算法。同时,Graphviz还支持丰富的图形语法,允许你...

    利用堆栈回溯、addr2line和Graphviz生成运行时函数调用图

    现在的软件源代码动则千万行,初学者常常感到迷惘,如果能自动生成关键函数的调用关系图,则思路可以清晰许多。如下面这幅图展示了WebKit网页渲染的部分函数执行过程,比单纯地看代码直观多了。 ...

    使用graphviz绘制流程图1

    Graphviz是一个强大的开源图形绘制工具,特别适合于创建流程图、网络图、UML模型以及许多其他类型的图表。它使用一种特定的领域特定语言(DSL),名为DOT语言,来描述图形结构,然后自动生成高质量的可视化图像,...

    分析 C 或 C++ 语言代码的函数调用关系

    在 Linux 环境下,借助工具 Code Vize 可提取出开源软件中函数以及函数之间的依赖关系,并将分析结果以文本形式输出到文件中,然后借助于可视化工具 Graphviz 可将节点以及节点之间的依赖关系以图形化的方式 展示...

    c语言函数调用关系图自动生成方法之使用egypt和gcc的-fdump-rtl-expand生成Graphviz

    在C语言编程中,理解函数调用关系是调试和优化代码的关键...总的来说,利用egypt和GCC的-fdump-rtl-expand选项生成Graphviz图是一种有效的可视化C语言函数调用关系的方法,可以帮助开发者更深入地理解代码的运行逻辑。

    cpp-C源代码自动分析工具得到UML类图和函数间调用关系网图

    Graphviz则专注于生成各种流程图和网络图,包括函数调用关系图。 总之,C++源代码自动分析工具是软件开发过程中的重要辅助工具,它们帮助开发者快速理解和管理复杂的代码结构。通过生成UML类图和函数调用关系图,...

    Python调用graphviz绘制结构化图形网络示例

    本文将详细介绍如何使用Python调用graphviz来绘制结构化的图形网络。 首先,要使用graphviz,你需要先在官网下载并安装Graphviz软件。安装完成后,确保将其安装目录下的`bin`路径添加到系统的环境变量中,这样...

    利用graphviz画函数关系图

    要使用该方法,要先安装gcc,python2.7,绝对可行,选择某一源文件,即可调用。源码内设路径可自行调整。

    Go-Gocyto-Go的调用图(Callgraph)分析和可视化

    "Go-Gocyto-Go的调用图(Callgraph)分析和可视化"是针对Go程序的一种高级调试和分析工具,它可以帮助开发者更直观地看到函数之间的调用关系,从而提高代码质量和维护性。 调用图(Callgraph)是一种图形表示形式,...

    CodeViz函数调用工具

    3. **生成图形**:分析完成后,CodeViz将生成一个或多个图形文件,如.dot或.svg格式,这些文件可以用图形查看器打开,如Graphviz,展示调用关系图。 4. **交互式查看**:一些版本的CodeViz可能还提供交互式的Web...

    函数关系自动生成

    "graphv"可能是指Graphviz,这是一个开源图形绘制软件,常被用作Doxygen的插件,用于绘制复杂的图表,如函数调用图。"htmlhe"可能是“HTML help”的缩写,与前面提到的CHM文件相关。 压缩包内的文件名称列表虽然未...

Global site tag (gtag.js) - Google Analytics