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



 

你可能感兴趣的:(Flex)