<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[介绍一个linux下生成C代码调用树的好工具calltree]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Fri, 07 Feb 2014 09:50:34 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/>一、<br/>平时用vim+cscope+ctags看程序还不错，但跳来跳去还是不太直观，如果能将C代码的调用生成调用树就再好不过了，果然，偶找到了一款不错的工具calltree，有了这个工具，可以说宏观微宏一起把握了，抛媚眼<br/><br/>先看一下用它生成的函数调用图:<br/><br/>源码是nbtscan小工具的代码.<br/><br/>ljt@debian:~/source/nbtscan-1.5.1$ calltree -gb -np -m *.c<br/><br/>main [nbtscan.c:289]:<br/>&#124; FD_ISSET<br/>&#124; FD_SET<br/>&#124; FD_ZERO<br/>&#124; atoi<br/>&#124; bind<br/>&#124; bzero<br/>&#124; d_print_hostinfo [nbtscan.c:93]<br/>&#124; &#124; inet_ntoa<br/>&#124; &#124; printf<br/>&#124; &#124; strncpy<br/>&#124; delete_list [list.c:29]<br/>&#124; &#124; free<br/>&#124; err_die<br/>&#124; err_print<br/>&#124; exit<br/>&#124; feof<br/>&#124; fgets<br/>&#124; fopen<br/>&#124; fprintf<br/>&#124; free<br/>&#124; getopt<br/>&#124; gettimeofday<br/>&#124; htons<br/>&#124; in_list [list.c:101]<br/>&#124; &#124; compare [list.c:47]<br/>&#124; &#124; new_list_item [list.c:17]<br/>&#124; &#124; &#124; err_die<br/>&#124; &#124; &#124; malloc<br/>&#124; inet_aton<br/>&#124; inet_ntoa<br/>&#124; insert [list.c:55]<br/>&#124; &#124; compare [list.c:47]<br/>&#124; &#124; free<br/>&#124; &#124; new_list_item [list.c:17]<br/>&#124; &#124; &#124; err_die<br/>&#124; &#124; &#124; malloc<br/>&#124; l_print_hostinfo [nbtscan.c:260]<br/>&#124; &#124; inet_ntoa<br/>&#124; &#124; printf<br/>&#124; &#124; strncpy<br/>&#124; malloc<br/>&#124; new_list [list.c:8]<br/>&#124; &#124; err_die<br/>&#124; &#124; malloc<br/>&#124; next_address [range.c:72]<br/>&#124; &#124; htonl<br/>&#124; &#124; ntohl<br/>&#124; ntohl<br/>&#124; parse_response [statusq.c:147]<br/>&#124; &#124; bzero<br/>&#124; &#124; get16 [statusq.c:137]<br/>&#124; &#124; &#124; memcpy<br/>&#124; &#124; &#124; ntohs<br/>&#124; &#124; get32 [statusq.c:127]<br/>&#124; &#124; &#124; memcpy<br/>&#124; &#124; &#124; ntohl<br/>&#124; &#124; malloc<br/>&#124; &#124; memcpy<br/>&#124; &#124; strncpy<br/>&#124; &#124; typeof<br/>&#124; print_banner [nbtscan.c:26]<br/>&#124; &#124; printf<br/>&#124; print_header [nbtscan.c:87]<br/>&#124; &#124; printf<br/>&#124; print_hostinfo [nbtscan.c:207]<br/>&#124; &#124; inet_ntoa<br/>&#124; &#124; printf<br/>&#124; &#124; strncpy<br/>&#124; printf<br/>&#124; recvfrom<br/>&#124; select<br/>&#124; send_query [statusq.c:93]<br/>&#124; &#124; bzero<br/>&#124; &#124; err_print<br/>&#124; &#124; gettimeofday<br/>&#124; &#124; htons<br/>&#124; &#124; inet_ntoa<br/>&#124; &#124; name_mangle [statusq.c:40]<br/>&#124; &#124; &#124; HAVE_SNPRINTF<br/>&#124; &#124; &#124; memset<br/>&#124; &#124; &#124; snprintf<br/>&#124; &#124; &#124; sprintf<br/>&#124; &#124; &#124; strcmp<br/>&#124; &#124; &#124; strlen<br/>&#124; &#124; &#124; toupper<br/>&#124; &#124; sendto<br/>&#124; &#124; snprintf<br/>&#124; set_range [nbtscan.c:80]<br/>&#124; &#124; is_ip [range.c:21]<br/>&#124; &#124; &#124; inet_addr<br/>&#124; &#124; &#124; ntohl<br/>&#124; &#124; is_range1 [range.c:36]<br/>&#124; &#124; &#124; abs<br/>&#124; &#124; &#124; atoi<br/>&#124; &#124; &#124; err_die<br/>&#124; &#124; &#124; free<br/>&#124; &#124; &#124; inet_addr<br/>&#124; &#124; &#124; malloc<br/>&#124; &#124; &#124; ntohl<br/>&#124; &#124; &#124; strchr<br/>&#124; &#124; &#124; strcpy<br/>&#124; &#124; &#124; strlen<br/>&#124; &#124; is_range2 [range.c:91]<br/>&#124; &#124; &#124; atoi<br/>&#124; &#124; &#124; err_die<br/>&#124; &#124; &#124; free<br/>&#124; &#124; &#124; inet_addr<br/>&#124; &#124; &#124; malloc<br/>&#124; &#124; &#124; ntohl<br/>&#124; &#124; &#124; strchr<br/>&#124; &#124; &#124; strcpy<br/>&#124; &#124; &#124; strlen<br/>&#124; sleep<br/>&#124; snprintf<br/>&#124; socket<br/>&#124; strcmp<br/>&#124; strdup<br/>&#124; timerclear<br/>&#124; timercmp<br/>&#124; timersub<br/>&#124; usage [nbtscan.c:32]<br/>&#124; &#124; exit<br/>&#124; &#124; printf<br/>&#124; v_print_hostinfo [nbtscan.c:156]<br/>&#124; &#124; getnbservicename [statusq.c:370]<br/>&#124; &#124; &#124; err_die<br/>&#124; &#124; &#124; malloc<br/>&#124; &#124; &#124; snprintf<br/>&#124; &#124; &#124; strstr<br/>&#124; &#124; inet_ntoa<br/>&#124; &#124; printf<br/>&#124; &#124; strncpy<br/><br/>还不错哦，能很直观地显示程序的架构<br/><br/>下面介绍一下各选项：<br/>ljt@debian:~/source/nbtscan-1.5.1$ calltree -gb -np -m *.c<br/><br/>-b 就是那个竖线了，很直观地显示缩进层次。<br/>-g 打印内部函数的所属文件名及行号，外部函数所属文件名和行号也是可打印的，详man<br/><br/>-np 不要调用c预处理器，这样打印出的界面不会很杂乱，但也可能会产生错误哦，如果我们只看<br/>函数的调用关系的话，不会有大问题。<br/>-m 告诉程序从main开始<br/><br/>还有一个重要的选项是 listfunction ，缩写是lf，用来只打印某个函数中的调用，用法是：<br/>$calltree -gb -np lf=send_query *.c<br/><br/>send_query [statusq.c:93]:<br/>&#124; bzero<br/>&#124; err_print<br/>&#124; gettimeofday<br/>&#124; htons<br/>&#124; inet_ntoa<br/>&#124; name_mangle [statusq.c:40]<br/>&#124; &#124; HAVE_SNPRINTF<br/>&#124; &#124; memset<br/>&#124; &#124; snprintf<br/>&#124; &#124; sprintf<br/>&#124; &#124; strcmp<br/>&#124; &#124; strlen<br/>&#124; &#124; toupper<br/>&#124; sendto<br/>&#124; snprintf<br/><br/>还有几个不太常用的就不介绍了，细节大家还是看man吧，另外说明一点的是，安装的时候它默认是安装到&quot;/opt/schily/&quot;目录下，下面有bin, man, include等几个目录，你可以设置环境变量，或者干脆把它拷贝到/usr里相应的目录下，或者修改Makefile啦<br/><br/><br/>下载地址：<br/><br/>ftp://ftp.berlios.de/pub/calltree/calltree-2.3.tar.bz2<br/><br/>摘录自：http://www.linuxsir.org/bbs/thread246389.html<br/><br/>二、C流程图生成器：<br/><a href="attachment.php?fid=371">点击这里下载文件</a>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] 介绍一个linux下生成C代码调用树的好工具calltree]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>