調(diào)試flex生成的代碼
c語言中可以使用詞法分析器flex 通過寫好的正則表達(dá)式來生成一些DFA自動(dòng)機(jī)的c語言代碼, 里面包含了自動(dòng)機(jī)的狀態(tài)。在網(wǎng)絡(luò)協(xié)議分析尤其是應(yīng)用層協(xié)議分析的時(shí)候會(huì)用到, 或者是使用BPF過濾器的語法的軟件中, 比如libpcap, wireshark, nfdump, l7-filter等等。
如何使用gdb或者oprofile或者perf tool來進(jìn)行調(diào)試呢?
gdb老的版本可能就亂了或者每次進(jìn)入到y(tǒng)y.lex.c之類的文件中運(yùn)行n命令只會(huì)打印出行號(hào), 并不會(huì)顯示出本行的c語言代碼, 最新的gcc版本編譯的可能能夠識(shí)別。
但是oprofile和perf就沒有這么強(qiáng)大的功能了, 嘗試了到目前最新的oprofile 0.9.9, 使用opannotate --source并不能dump出flex生成的c語言文件的相關(guān)信息。
perf 工具使用perf record捕捉后運(yùn)行perf report 只能得到相關(guān)的匯編語言代碼。
后來經(jīng)過查看源代碼發(fā)現(xiàn), 生成的c語言文件一般是include到別的c語言文件中, 里面會(huì)有一些#line的宏定義, 方便為了調(diào)試的時(shí)候?qū)?dāng)前行定位到不同的地方或者是原始的 .l 文件中, 我們知道#line的作用就是改變當(dāng)前的行號(hào)。
手動(dòng)將所有#line所在的行全部注釋掉, 重新編譯。
OK, perf report查看c語言代碼一切水到渠成。
目前perf tool基本只能看個(gè)大概趨勢, 并不是什么精確, 有時(shí)候百分比加起來竟然大于100%, 真是讓小伙伴們不明覺厲啊。
oprofile用起來有點(diǎn)麻煩, 每次都得手動(dòng)輸入一堆命令行參數(shù), 當(dāng)然寫在了一個(gè)腳本里, 但是oprofile好像無法attach正在運(yùn)行的進(jìn)程。
聽說dtrace是一個(gè)很不錯(cuò)的東西, 由于是sun公司搞的,主要是用在spark架構(gòu)上, 目前尚未聽 說有通用的linux版本, 但是有一個(gè)systemtap的東西現(xiàn)在正在火熱當(dāng)中。