摘要:我想用GDB提取存儲在存儲器中,我的嵌入式目標覆蓋範圍執行計數,並用它們來創建.gcda
文件(餵養的gcov/lcov)。通過QEMU/GDB生成.gcda覆蓋文件
的設置:
- 我可以成功交叉編譯的二進制我,我的目標特定的嵌入式目標 - 然後執行它QEMU下。
- 我也可以使用QEMU的GDB支持來調試二進制文件(即使用
tar extended-remote localhost:...
附加到正在運行的QEMU GDB服務器,並完全控制我的二進制文件的執行)。
範圍: 現在, 「關於目標」 覆蓋分析執行,我 -fprofile-arcs -ftest-coverage
交叉編譯。然後GCC發出64位計數器來跟蹤特定代碼塊的執行計數。
在正常(即基於主機,非交叉編譯)執行下,應用程序結束時__gcov_exit
被調用 - 並將所有這些執行計數收集到.gcda
文件中(gcov然後用於報告覆蓋細節)。
但是,在我的嵌入式目標中,沒有文件系統可言 - 而libgcov基本上包含所有__gcov_...
函數的空存根。通過QEMU/GDB
解決方法:爲了解決這個問題,並做一個GCC版本無關的方式,我可以通過MYPLATFORM-readelf
列出我的二進制覆蓋相關的符號,並grep
退房手續相關的人(例如__gcov0.Task1_EntryPoint
,__gcov0.worker
等):
$ MYPLATFORM-readelf -s binary | grep __gcov
...
46: 40021498 48 OBJECT LOCAL DEFAULT 4 __gcov0.Task1_EntryPoint
...
我可以然後使用報告給自動創建GDB腳本的偏移量/大小 - 即通過簡單的存儲器中提取的計數器數據轉儲的腳本(從偏移,轉儲長度字節t o本地文件)。
我不知道什麼(並未能找到任何相關信息/工具)是如何產生的的雙(內存偏移,內存中的數據)到.gcda
文件轉換。如果存在這樣的工具/腳本,我會有一種可移植的(與平臺無關的)方式來覆蓋任何QEMU支持的平臺。
有沒有這樣的工具/腳本?
任何建議/指針將不勝感激。
UPDATE:我自己解決了這個問題,你可以在下面閱讀 - 並寫了一個blog post about it。