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的东西现在正在火热当中。



  • 相关阅读:
    MySQL中的char与varchar详解
    有关PHPstorm的git环境的配置和git密钥的生成总结
    PHP开发中常用的字符串操作函数
    PHP 二维数组排序函数的应用 array_multisort()
    大龄程序员的出路在哪里
    近期面试总结(PHP后端开发工程师)(部分笔试题)
    B-Tree目录和Hash索引的区别
    curl、fopen和file_get_contents区别
    什么是OAuth授权
    SEO 统计算法
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3257847.html
Copyright © 2011-2022 走看看