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