当我们遇到一个新的程序的时候,经常会无从下手,需要debug一个功能的时候,我们不知道函数的运行流程是怎么样的,这就需要借助工具来帮助我们加快流程了。这里以分析wpa_supplicant为例子。看看gprof是如何帮助我们分析代码的。
 
 
这里以虚拟机里面的ubuntu12.04为例,开始debug wpa_supplicant。
 
 
 

编译wpa_supplicant

 
首先,需要下载wpa_supplicant.
 
 
这里的重点是gprof,所以这里不细讲它的配置。
 
 
首先cp defconfig .config,不然会出现:
 
  1. 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。
 
当然没那么容易,这里会报错,说明我们需要安装额外的库:
  1. ../src/drivers/driver_nl80211.c::: fatal error: netlink/genl/genl.h:No such file or directory
紧接着:
 
  1. sudo apt-get install libnl-dev
 
好了,make接下来就可以编译出wpa_supplicant,wpa_cli等工具。
 
 

驱动网卡

 
 
插上USB网卡,报错了,看起来系统里面没有firmware:
 
 
那么去下载一个新版的driver来装上。
 
 
顺带提一下我用的kernel:
  1. uname -a
    Linux tan-VirtualBox3.13.0--generic#~precise1-Ubuntu SMP Tue Jul :: UTC i686 i686 i386 GNU/Linux
下载了larry维护的驱动:
  1. https://github.com/lwfinger/rtl8188eu
 
make;sudo make install 成功装上了。
然后在虚拟机里面重新插拔usb 无线网卡。
 
在network-manager可以scan到设备了,到此为止
 
 
为了防止被network-manager干扰,首先在UI上面关掉无线网络,去掉enable wifi
 
 
 

使用wpa_supplicant

 
环境都有了,然后可以开始用了。接下来需要干掉系统自带的wpa_supplicant。
 
 
  1. 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.?Ss22::/sbin/wpa_supplicant -B -P /run/sendsigs.omit.d/wpasupplicant.pid -u -s -O /var/run/wpa_supplicant

    强行干掉:

  1. sudo killall wpa_supplicant
带起wlan接口:
 
  1. sudo ifconfig wlan0 up
新建一个配置文件(basic.conf),将其开起来,为了简单,内容只填一行:
  1. ctrl_interface=/var/run/wpa_supplicant
然后开起来wpa_supplicant:
  1. tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ sudo wpa_supplicant -Dwext-iwlan0 -c./basic.conf

    最后使用wpa_cli扫描一下:

扫描结果我就不贴出来了。
  1. 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的网站,有兴趣可以看看
  1. https://sourceware.org/binutils/docs-2.16/gprof/
 
这里才是重头戏,前面做了这么多准备工作,这里就需要分析一下scan流程了。首先需要看一下它的makefile,将需要的东西加上。
 
 
改一下Makefile(主要是加上-pg参数,编译和链接时都要加上,然后把优化去掉,防止它漏函数):
 
  1. ifndef CFLAGS
    #CFLAGS = -MMD -O2 -Wall -g
    CFLAGS =-pg -O0 -g
    LDFLAGS =-pg -O0 -g
    endif
 
然后运行:
  1. tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ sudo ./wpa_supplicant -Dwext-iwlan0 -c./basic.conf
然后ctrl+c,会生成一个gmon.out,接下来就可以根据这个文件生成一个txt:
 
  1. gprof ./wpa_supplicant > test.txt
截图看看:
 
下面简单分析一个片段:
 
  1. -----------------------------------------------
  2. 0.000.0014/14 wpa_bss_update_scan_res [55]
  3. [47]0.00.000.0014 wpa_bss_add [47]
  4. 0.000.0028/28 dl_list_add_tail [23]
  5. 0.000.0014/68 os_zalloc [10]
  6. 0.000.0014/14 wpa_bss_copy_res [49]
  7. 0.000.0014/14 wpa_bss_set_hessid [53]
  8. 0.000.0014/28 wpa_ssid_txt [30]
  9. 0.000.0014/53 wpa_msg [15]
  10. 0.000.0014/14 wpas_notify_bss_added [62]
  11. -----------------------------------------------
其中,这里的主函数是wpa_bss_add,它上面的都是调用它的,它下面的都是它调用的。左边是调用次数。
根据这个,就可以生成一个调用图。
 
 

生成gprof调用图

 
首先我们要安装下这个工具:
 
  1. tan@tan-VirtualBox:~/gprof$ git clone https://github.com/jrfonseca/gprof2dot
    sudo apt-get install graphviz
 
使用流程是将生成的txt给python脚本,然后再通过dot工具画出来(可以是pdf,png等)。
 
  1. tan@tan-VirtualBox:~/gprof/wpa_supplicant-2.5/wpa_supplicant$ cat test.txt |../../gprof2dot/gprof2dot.py | dot -Tpng-o test.png
图里面就这么点东西,是不是感觉被欺骗了。
 
实际上它是拿了一些最消耗性能的函数画了出来。接下来将它全部画出来。
  1. 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。
 
 
 
 
 
冰山一角:
 
是不是挺带感的?
 
 
那么我们再来扫描一下:
  1. 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.这篇博客里面有没写明白的请指出。
 
 
 
 
 
 
 
 
 
 
 
 

linux 代码分析工具 gprof - 以wpa_supplicant为例的更多相关文章

  1. 性能分析工具gprof介绍(转载)

    性能分析工具gprof介绍Ver:1.0 目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profil ...

  2. (转)超全整理!Linux性能分析工具汇总合集

    超全整理!Linux性能分析工具汇总合集 原文:http://rdc.hundsun.com/portal/article/731.html 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望, ...

  3. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  4. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  5. C++静态代码分析工具推荐——PVS-Studio

    长假归来,最近一直没更新,节前本来就想写这篇了,一直到今天才有时间. 关于静态代码分析在维基百科上可以查到很详细的介绍:https://en.wikipedia.org/wiki/List_of_to ...

  6. 来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:来试试这个来自静态代码分析工具PVS Studio提供C++的小测验吧.

  7. Cppcheck 1.54 C/C++静态代码分析工具

    Cppcheck是一个C/C++代码分析工具,只检测那些编译器通常无法检测到的bug类型.   官方上建议让编译器提供尽量多的警告提示:1.使用Visual C++的话,应使用警告等级4 2.使用GC ...

  8. 阅读代码分析工具Understand 2.0试用

    Understand 2.0是一款源码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实能够大大提高代码阅读效率. 因为Understand功能十分强大,本文不可能详尽地介绍它的全部功能,所 ...

  9. [转载] 常用 Java 静态代码分析工具的分析与比较

    转载自http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代 ...

随机推荐

  1. javascript关于继承

    上一篇已介绍了组合继承,现在讲讲剩余的几种继承. 原型式继承 调用一个函数,接收这个函数返回来的对象,这个对象的原型就是传入函数的参数对象. 如: function personObject(o){ ...

  2. 【HTML】 frame和iframe的区别

    1.frame不能脱离frameSet单独使用,iframe可以: 2.frame不能放在body中:如下可以正常显示: <!--<body>--> <frameset ...

  3. CSS、j's单行、多行文本溢出显示省略号

    在项目中,由于实际描述文字过多,导致初始页面纵向长度过长,也使得余下信息利用率降低:所以在文字过多的时候,初始化限制行数是有必要的 1. CSS单行文本溢出,显示省略号 <div style=& ...

  4. 移动端全兼容的flexbox速成班

    说起flexbox,都算是件陈年旧事了,它是2009年W3C提出的一种全新的可伸缩的CSS布局方式.依赖flexbox,我们可以更简单,高效的完成可伸缩式页面的布局. 业界与flexbox的相关教程文 ...

  5. js 20160810

    jquery 获取不到所有相同id 的元素 ,只能获取此id的第一个元素.可以获取所有相同class 的元素

  6. Egret白鹭H5小游戏开发入门(二)

    前言: 昨天的文章中简单的介绍了Egret白鹭引擎从安装到基本的使用配置等问题,今天着重介绍H5小游戏开发的起步阶段,如Wing面板的使用,素材的处理,类的说明,开始布局等等. 整体概况: 根据上一篇 ...

  7. reason: '[<__NSDictionary0 0x7fda88f00c90> setValue:forUndefinedKey:]: this class is not key value c

    reason: '[<__NSDictionary0 0x7fda88f00c90> setValue:forUndefinedKey:]: this class is not key v ...

  8. Expdp 导数错误 ORA-00832

    问题实验环境 操作系统:Red Hat Enterprise Linux Server release 5.7 (Tikanga) 数据库  :Oracle Database 10g Release ...

  9. Linux 如何通过命令仅获取IP地址

    一同事的朋友正在参加笔试,遇到这么一个问题让他帮忙解决,结果同事又找到我帮他搞定.真是感慨:通讯发达在某些方面来说,真不知是不是好事啊!题目大致如下所示,一般我们使用ifconfig查看网卡信息,请问 ...

  10. Ignite安装配置——中篇

    Linux Ignite配置——上篇大体介绍了一下Ignite工具的功能.特性等,以及如何在Linux 上安装配置.从上篇可见Ignite安装非常的简单方便.下面介绍一下Ignite Reposito ...