2014-01-09 16 views
1

我想實現一些額外的功能LibreOffice打印過程(一些特殊的信息應該自動添加到每個打印頁面的邊緣)。我使用的是RHEL 6.4和LibreOffice 4.0.4和Gnome 2.28。LibreOffice:確定源代碼部分負責打印

我的目的是研究LibreOffice和系統組件之間的數據流,並確定哪些源代碼負責打印。之後,我將不得不修改這些代碼部分。

現在我需要關於源代碼研究方法的建議。我發現了大量的工具,從我的角度來看:

  1. strace似乎是非常低級的;
  2. gprof需要使用「-pg」重新編譯的二進制文件CFLAGS;不知道如何用LibreOffice做到這一點;
  3. systemtap只能探測系統調用,不是嗎?
  4. callgrind + Gprof2Dot在一起很好,但執行奇怪的結果(見下文);

例如這裏是從與Gprof2Dot可視化callgrind輸出調用圖。我有這種命令啓動callgrind

valgrind --tool=callgrind --dump-instr=yes --simulate-cache=yes --collect-jumps=yes /usr/lib64/libreoffice/program/soffice --writer 

和接收四個輸出文件:

-rw-------. 1 root root   0 Jan 9 21:04 callgrind.out.29808 
-rw-------. 1 root root  427196 Jan 9 21:04 callgrind.out.29809 
-rw-------. 1 root root  482134 Jan 9 21:04 callgrind.out.29811 
-rw-------. 1 root root  521713 Jan 9 21:04 callgrind.out.29812 

最後一個(PID 29812)對應於運行的LibreOffice作家GUI應用(與strace確定它和ps aux)。我按了CTRL + P和確定按鈕。然後我關閉了應用程序,希望看到在日誌中負責打印進程初始化的功能。

根據此答案,callgrind輸出使用Gprof2Dot工具進行處理。不幸的是,我不能在圖片上看到我感興趣的動作,也沒有看到通話圖。

我會很感激任何有關解決這個問題的正確方法。謝謝。

enter image description here

回答

1

解決這個問題記住的LibreOffice是開源的正確方法。整個源代碼都有文檔記錄,您可以瀏覽文檔docs.libreoffice.org。不要那麼辛苦:)

此外,請記住,打印機設置對話框不是LibreOffice特定的,而是由操作系統提供的。

1

你想要什麼是一個工具來識別感興趣的源代碼。測試覆蓋率(TC)工具可以提供這些信息。

TC工具所做的是確定何時運行程序代碼片段;把它看作是收集一組代碼區域。通常,TC工具與(交互式/單元/集成/系統)測試結合使用,以確定測試的有效性。如果只有少量代碼被執行(由TC工具檢測到),則測試被解釋爲無效或不完整;如果覆蓋的比例很大,那麼就可以有合理的運輸產品的理由(假設所有測試都通過了)。

但是,您可以使用TC工具來查找實現功能的代碼。首先,您執行一些測試(或者手動驅動軟件)以執行感興趣的功能,並收集TC數據。這告訴你所使用的所有代碼的集合,如果使用了這個特性;這是對你感興趣的代碼的高估。然後你練習這個程序,要求它做一些類似的活動,但是不會執行這個功能。這標識了絕對不實現該功能的一組代碼。計算代碼執行與特徵和...的集合差異,而不用確定更關注於支持該特徵的代碼。

通過運行更多的練習功能和更多的不會練習功能和計算這些集合的聯合差異,您自然可以獲得更加緊密的界限。

有C++的TC工具,例如「gcov」。我認爲,他們中的大多數不會讓/幫助你計算結果上的這種集合差異;許多TC工具似乎沒有任何操作覆蓋集的支持。 (我公司製造了一系列具有此功能的TC工具,包括計算覆蓋集差異,包括C++)。

如果你真的想要提取的相關代碼,TC工具不這樣做。 他們只是通過指定源文件中的文本區域來告訴你什麼代碼。大多數測試覆蓋工具僅報告覆蓋作爲此類文本區域;這部分是因爲許多測試覆蓋工具使用的機器僅限於編譯器記錄的行號。

但是,人們可以使用測試覆蓋率工具來精確地報告文本區域的文件/行/列到結束文件/行/列(我公司的工具恰好這樣做)。有了這些信息,構建一個簡單的程序來讀取源文件並從字面上提取已執行的代碼是非常簡單的。 (這並不意味着提取的代碼是一個格式良好的程序!例如,數據聲明將不會包含在執行的片段中,儘管它們是必需的)。

OP沒有說明他打算如何處理這樣的代碼,所以碎片集可能只是需要的。如果他想提取代碼和必要的聲明,他需要更復雜的工具來確定所需的聲明。具有完整解析器和源代碼名稱解析器的程序轉換工具可以爲此提供必要的功能。這比使用臨時提取文本提取測試覆蓋率工具要複雜得多。