linux 代码分析工具 gprof - 以wpa_supplicant为例
当我们遇到一个新的程序的时候,经常会无从下手,需要debug一个功能的时候,我们不知道函数的运行流程是怎么样的,这就需要借助工具来帮助我们加快流程了。这里以分析wpa_supplicant为例子。看看gprof是如何帮助我们分析代码的。
这里以虚拟机里面的ubuntu12.04为例,开始debug wpa_supplicant。
编译wpa_supplicant
首先,需要下载wpa_supplicant.
这里的重点是gprof,所以这里不细讲它的配置。
首先cp defconfig .config,不然会出现:
-
tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ make Building wpa_supplicant requires a configuration file (.config).See README for more instructions.You can run "cp defconfig .config" to create an example configuration. make:***[verify_config]Error1
然后执行make,生成wpa_supplicant。
当然没那么容易,这里会报错,说明我们需要安装额外的库:
-
../src/drivers/driver_nl80211.c:17:31: fatal error: netlink/genl/genl.h:No such file or directory
紧接着:
-
sudo apt-get install libnl-dev
好了,make接下来就可以编译出wpa_supplicant,wpa_cli等工具。
驱动网卡
插上USB网卡,报错了,看起来系统里面没有firmware:
那么去下载一个新版的driver来装上。
顺带提一下我用的kernel:
-
uname -a Linux tan-VirtualBox3.13.0-32-generic#57~precise1-Ubuntu SMP Tue Jul 15 03:50:54 UTC 2014 i686 i686 i386 GNU/Linux
下载了larry维护的驱动:
https://github.com/lwfinger/rtl8188eu
make;sudo make install 成功装上了。
然后在虚拟机里面重新插拔usb 无线网卡。
在network-manager可以scan到设备了,到此为止
为了防止被network-manager干扰,首先在UI上面关掉无线网络,去掉enable wifi
使用wpa_supplicant
环境都有了,然后可以开始用了。接下来需要干掉系统自带的wpa_supplicant。
-
tan@tan-VirtualBox:~/Downloads/rtl8188eu-master$ ps -aux | grep wpa Warning: bad ps syntax, perhaps a bogus '-'?See http://procps.sf.net/faq.html root 135900.00.259802112?Ss22:020:00/sbin/wpa_supplicant -B -P /run/sendsigs.omit.d/wpasupplicant.pid -u -s -O /var/run/wpa_supplicant
-
sudo killall wpa_supplicant
带起wlan接口:
-
sudo ifconfig wlan0 up
新建一个配置文件(basic.conf),将其开起来,为了简单,内容只填一行:
ctrl_interface=/var/run/wpa_supplicant
然后开起来wpa_supplicant:
-
tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ sudo wpa_supplicant -Dwext-iwlan0 -c./basic.conf
扫描结果我就不贴出来了。
-
tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ sudo ./wpa_cli scan Selected interface 'wlan0' OK tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ sudo ./wpa_cli scan_r Selected interface 'wlan0'
使用带gprof的wpa_supplicant
grpof的网站,有兴趣可以看看
https://sourceware.org/binutils/docs-2.16/gprof/
这里才是重头戏,前面做了这么多准备工作,这里就需要分析一下scan流程了。首先需要看一下它的makefile,将需要的东西加上。
改一下Makefile(主要是加上-pg参数,编译和链接时都要加上,然后把优化去掉,防止它漏函数):
-
ifndef CFLAGS #CFLAGS = -MMD -O2 -Wall -g CFLAGS =-pg -O0 -g LDFLAGS =-pg -O0 -g endif
然后运行:
-
tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ sudo ./wpa_supplicant -Dwext-iwlan0 -c./basic.conf
然后ctrl+c,会生成一个gmon.out,接下来就可以根据这个文件生成一个txt:
-
gprof ./wpa_supplicant > test.txt
截图看看:
下面简单分析一个片段:
-----------------------------------------------
0.000.0014/14 wpa_bss_update_scan_res [55]
[47]0.00.000.0014 wpa_bss_add [47]
0.000.0028/28 dl_list_add_tail [23]
0.000.0014/68 os_zalloc [10]
0.000.0014/14 wpa_bss_copy_res [49]
0.000.0014/14 wpa_bss_set_hessid [53]
0.000.0014/28 wpa_ssid_txt [30]
0.000.0014/53 wpa_msg [15]
0.000.0014/14 wpas_notify_bss_added [62]
-----------------------------------------------
其中,这里的主函数是wpa_bss_add,它上面的都是调用它的,它下面的都是它调用的。左边是调用次数。
根据这个,就可以生成一个调用图。
生成gprof调用图
首先我们要安装下这个工具:
-
tan@tan-VirtualBox:~/gprof$ git clone https://github.com/jrfonseca/gprof2dot sudo apt-get install graphviz
使用流程是将生成的txt给python脚本,然后再通过dot工具画出来(可以是pdf,png等)。
-
tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ cat test.txt |../../gprof2dot/gprof2dot.py | dot -Tpng-o test.png
图里面就这么点东西,是不是感觉被欺骗了。
实际上它是拿了一些最消耗性能的函数画了出来。接下来将它全部画出来。
-
tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ cat test.txt |../../gprof2dot/gprof2dot.py -n0 -e0| dot -Tpng-o test_full.png
这里画出来的图有点恐怖了,建议用大内存电脑打开,推荐acdsee。
冰山一角:
是不是挺带感的?
那么我们再来扫描一下:
-
tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ sudo ./wpa_cli scan [sudo] password for tan: Selected interface 'wlan0' OK tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ sudo ./wpa_cli scan_r gprof ./wpa_supplicant |../../gprof2dot/gprof2dot.py -n0 -e0| dot -Tpng-o test_full.png
这一把颜色全红了,估计是卡了。当然了,要分析流程还是要结合代码来看看。这里的工具可以加快分析
另外几个注意点:
1.不要将gprof用于daemon,之前我调试mpc/mpd/ffmpeg怎么也出不来gmon.out,原来是对于kill signal,gprof无法正常handle,我试过捕获kill正常exit也不行,后来加了参数让它--no-daemon就可以了
2.画的图有时候太复杂,看看txt就可以了
3.此工具不适合kernel流程分析
4.还有其他好工具可以分析,不要吊死在一棵树上。不强调调试时性能的可以试试valgrind,画出来的图还可以点击。
5.这篇博客里面有没写明白的请指出。