zoukankan      html  css  js  c++  java
  • 调试flex生成的代码

    c语言中可以使用词法分析器flex 通过写好的正则表达式来生成一些DFA自动机的c语言代码, 里面包含了自动机的状态。在网络协议分析尤其是应用层协议分析的时候会用到, 或者是使用BPF过滤器的语法的软件中, 比如libpcap, wireshark, nfdump, l7-filter等等。


    如何使用gdb或者oprofile或者perf tool来进行调试呢?


    gdb老的版本可能就乱了或者每次进入到yy.lex.c之类的文件中运行n命令只会打印出行号, 并不会显示出本行的c语言代码, 最新的gcc版本编译的可能能够识别。

    但是oprofile和perf就没有这么强大的功能了, 尝试了到目前最新的oprofile 0.9.9, 使用opannotate --source并不能dump出flex生成的c语言文件的相关信息。

    perf 工具使用perf record捕捉后运行perf report 只能得到相关的汇编语言代码。


    后来经过查看源代码发现, 生成的c语言文件一般是include到别的c语言文件中, 里面会有一些#line的宏定义, 方便为了调试的时候将当前行定位到不同的地方或者是原始的 .l 文件中, 我们知道#line的作用就是改变当前的行号。

    手动将所有#line所在的行全部注释掉, 重新编译。

    OK, perf report查看c语言代码一切水到渠成。

    目前perf tool基本只能看个大概趋势, 并不是什么精确, 有时候百分比加起来竟然大于100%, 真是让小伙伴们不明觉厉啊。

    oprofile用起来有点麻烦, 每次都得手动输入一堆命令行参数, 当然写在了一个脚本里, 但是oprofile好像无法attach正在运行的进程。

    听说dtrace是一个很不错的东西, 由于是sun公司搞的,主要是用在spark架构上, 目前尚未听 说有通用的linux版本, 但是有一个systemtap的东西现在正在火热当中。



  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3257847.html
Copyright © 2011-2022 走看看