本發(fā)明涉及數(shù)據(jù)分析技術(shù)領(lǐng)域,尤其涉及一種高效的運行時程序內(nèi)部函數(shù)指針、變量等獲取方法。
背景技術(shù):
現(xiàn)有的軟件開發(fā)中,經(jīng)常需要對源程序進行分析與調(diào)優(yōu)等操作,這些操作都需要對運行時程序內(nèi)部信息進行追蹤,例如,在源程序二次開發(fā)過程中,需要事先對源程序進行分析,會涉及到對源程序內(nèi)部信息的獲取與追蹤,在軟件單元測試中,也會涉及源程序信息獲取。
目前源程序分析中獲取內(nèi)部信息的主流的做法是:(1)在源程序中加入很多的打印語句去打印出局部變量或全局變量;(2)利用gdb等其他第三方工具去運行源程序,從而單步運行觀察局部變量和全局變量,在大項目中,工作量極大。
對于軟件單元測試,也因不容易獲取內(nèi)部函數(shù)信息,常通過預先設(shè)定輸入?yún)?shù),并給出期待值,然后對方法的返回值和期待值做對比,這種方式需要搭建測試環(huán)境、準備輸入輸出比較麻煩,效率不高。
因此,急需一種高效率的,又能盡可能減少對源程序的修改與侵入的運行時程序內(nèi)部數(shù)據(jù)獲取方法,提高源程序分析效率。
技術(shù)實現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題,在于提供一種運行時程序信息獲取方法,避免對源程序的過渡修改與侵入,保證源程序完整性,提高后續(xù)源程序的分析效率。
本發(fā)明是這樣實現(xiàn)的:一種運行時程序信息獲取方法,包括如下步驟:
步驟1、創(chuàng)建一外部程序,所述外部程序包括方法指針注冊模塊;
步驟2、啟動源程序,通過操作系統(tǒng)庫調(diào)用所述外部程序的方法指針注冊模塊,將源程序的函數(shù)地址傳給所述外部程序;
步驟3、所述外部程序根據(jù)所述函數(shù)地址獲取所述源程序的內(nèi)部信息。
進一步的,所述操作系統(tǒng)庫為windows的dll庫或linux的libdl.so庫。
進一步的,所述內(nèi)部信息包括線程id和全局變量。
本發(fā)明具有如下優(yōu)點:通過把源程序的接口暴露給外部程序,由外部程序去調(diào)用主程序獲取內(nèi)部變量,從而進一步獲取源程序的內(nèi)部信息,無需對源程序進行大量修改操作,保證了源程序的完整性,極大的降低了因源程序的修改與侵入對分析結(jié)果造成的影響,大大提高源程序分析效率。
附圖說明
下面參照附圖結(jié)合實施例對本發(fā)明作進一步的說明。
圖1為本發(fā)明一種運行時程序信息獲取方法流程圖。
具體實施方式
如圖1所示,本發(fā)明一種運行時程序信息獲取方法,包括如下步驟:
步驟1、創(chuàng)建一外部程序,所述外部程序包括方法指針注冊模塊,所述外部程序還包括一用于存儲內(nèi)部信息的存儲模塊;
步驟2、啟動源程序,通過操作系統(tǒng)庫調(diào)用所述外部程序的方法指針注冊模塊,將源程序的函數(shù)地址傳給所述外部程序,所述操作系統(tǒng)庫為windows的dll庫或linux的libdl.so庫;
步驟3、所述外部程序根據(jù)所述函數(shù)地址獲取所述源程序的內(nèi)部信息,所述內(nèi)部信息包括線程id和全局變量。
實施例一
在輕量級線程分析中,以linux系統(tǒng)為例,采用本發(fā)明方法獲取輕量級線程id的方法如下:
創(chuàng)建一外部程序(libinstrument.so),包括一個方法指針注冊模塊和一個保存方法指針的變量(void(*callback)()=null);
啟動源程序,在程序入口(main函數(shù))通過dl庫(libdl.so庫的api)調(diào)用所述外部程序的方法指針注冊模塊(register_profile_func),把源程序內(nèi)部方法指針暴露給所述外部程序,并存儲到所述變量中;
所述外部程序得到內(nèi)部的方法指針后,根據(jù)所述方法指針可任意時刻調(diào)用并獲取內(nèi)部的線程id。
本實施例采用把源程序的接口暴露給外部程序,由外部程序調(diào)用源程序獲取內(nèi)部的輕量級線程id,幾乎不需要修改源程序,即可完成對輕量級線程信息的獲取,為后期源程序分析提供重要依據(jù)。
實施例二
在軟件單元測試中,采用本發(fā)明方法獲取源程序函數(shù)指針,進而調(diào)用主程序函數(shù)執(zhí)行測試,以windows系統(tǒng)下的軟件單元測試為例,具體包括如下步驟:
在dll庫中編寫測試代碼和外部程序,所述外部程序包括用于獲取函數(shù)地址的方法指針注冊模塊;
在源程序內(nèi),獲取dll庫操作權(quán),通過dll庫調(diào)用所述外部程序的方法指針注冊模塊,將所述源程序的內(nèi)部函數(shù)地址暴露給所述外部程序;
根據(jù)所述函數(shù)地址在dll庫中調(diào)用所述源程序函數(shù)執(zhí)行測試。
上述測試方法,較通過采集輸入輸出參數(shù)方式的測試快很多,大大提高測試效率,同時提高了測試質(zhì)量。
本發(fā)明中,除了可以獲取源程序的線程id外,根據(jù)需要還可以通過獲取內(nèi)部全局變量等,來跟蹤監(jiān)控源程序,便于后期分析。
本發(fā)明通過把源程序的接口暴露給外部程序,由外部程序調(diào)用源程序的方式,獲得源程序內(nèi)部信息,幾乎不需要修改源程序,即可完成對內(nèi)部信息的獲取,極大的保護了源程序的完整性,提高了內(nèi)部函數(shù)獲取效率,從而提高源程序分析效率。
雖然以上描述了本發(fā)明的具體實施方式,但是熟悉本技術(shù)領(lǐng)域的技術(shù)人員應(yīng)當理解,我們所描述的具體的實施例只是說明性的,而不是用于對本發(fā)明的范圍的限定,熟悉本領(lǐng)域的技術(shù)人員在依照本發(fā)明的精神所作的等效的修飾以及變化,都應(yīng)當涵蓋在本發(fā)明的權(quán)利要求所保護的范圍內(nèi)。