1

LibreOffice 印刷プロセスにいくつかの追加機能を実装しようとしています (すべての印刷ページのマージンに特別な情報を自動的に追加する必要があります)。LibreOffice 4.0.4 および Gnome 2.28 で RHEL 6.4 を使用しています。

私の目的は、LibreOffice とシステム コンポーネント間のデータ フローを調査し、どのソース コードが印刷を担当しているかを判断することです。その後、コードのこれらの部分を変更する必要があります。

次に、ソース コードの調査方法についてアドバイスが必要です。私はたくさんのツールを見つけました、そして私の観点から:

  1. strace非常に低レベルのようです。
  2. gprof「-pg」CFLAGS で再コンパイルされたバイナリが必要です。LibreOfficeでそれを行う方法がわかりません。
  3. systemtapシステムコールのみをプローブできますね。
  4. callgrind+Gprof2Dot組み合わせると非常に良いが、奇妙な結果をもたらす (以下を参照)。

たとえば、視覚化されたcallgrind出力からの呼び出しグラフは次のとおりです。Gprof2Dot私はcallgrindそのようなコマンドから始めました:

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

4 つの出力ファイルを受け取りました。

-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

最後の 1 つ (pid 29812) は、実行中の LibreOffice Writer GUI アプリケーションに対応します (straceおよび で決定しましたps aux)。CTRL+PとOKボタンを押しました。次に、プロセスの初期化をログに出力する機能を確認することを期待して、アプリケーションを閉じました。

callgrind出力は、この回答に従ってツールで処理されましたGprof2Dot。残念ながら、私が興味を持っているアクションもコール グラフもそのままの状態では、画像には表示されません。

このような問題を解決する適切な方法についての情報をいただければ幸いです。ありがとうございました。

ここに画像の説明を入力

4

2 に答える 2

1

必要なのは、対象のソース コードを識別するためのツールです。テスト カバレッジ (TC) ツールは、この情報を提供できます。

TC ツールが行うことは、プログラムが実行されたときに、どのコード フラグメントが実行されたかを判断することです。コード領域のセットとして収集すると考えてください。通常、TC ツールは (インタラクティブ/ユニット/統合/システム) テストと組み合わせて使用​​され、テストの効果を判断します。少量のコードしか実行されていない場合 (TC ツールによって検出された場合)、テストは無効または不完全であると解釈されます。大部分がカバーされている場合は、製品を出荷するための合理的な正当性として、優れたテストがあります (すべてのテストに合格したと仮定します)。

ただし、TC ツールを使用して、機能を実装するコードを見つけることができます。最初に、テストを実行して (またはソフトウェアを手動で操作して)、目的の機能を実行し、TC データを収集します。これは、機能が使用されている場合、実行されたすべてのコードのセットを示します。これは、関心のあるコードの過大評価です。次に、プログラムを実行して、同様のアクティビティを実行するように要求しますが、機能は実行されません。これにより、機能を実装していないコードのセットが明らかになります。機能をサポートすることに重点を置いたコードを決定するために、機能を使用して実行されるコードと機能を使用せずに実行されるコードのセット差を計算します。

より多くのexercise-featureとmore doesn't-exercise-featureを実行し、これらのセットの和集合の差を計算することで、より厳密な境界を自然に得ることができます。

「gcov」など、C++ 用の TC ツールがあります。それらのほとんどは、結果に対するそのような集合の違いを計算させたり助けたりしないと思います。多くの TC ツールは、対象セットの操作をサポートしていないようです。(私の会社は、C++ を含むカバレッジ セットの違いを計算するなど、この機能を備えた TC ツールのファミリを作成しています)。

関連するコードを実際に抽出したい場合、TC ツールはそれを行いません。ソース ファイル内のテキスト領域を指定することで、どのコードかを示すだけです。ほとんどのテスト カバレッジ ツールは、そのようなテキスト領域としてカバーされた行のみを報告します。これは、多くのテスト カバレッジ ツールが使用する機械が、コンパイラによって記録された行番号に限定されているためです。

ただし、ファイル/行/列の開始からファイル/行/列の終了まで、テキスト領域を正確にレポートするテストカバレッジツールを使用できます (私の会社のツールはたまたまこれを行っています)。この情報があれば、ソース ファイルを読み取り、実行されたコードをそのまま抽出する簡単なプログラムを作成するのはかなり簡単です。(これは、抽出されたコードが整形式のプログラムであることを意味するわけではありません!たとえば、データ宣言は必要であるにもかかわらず、実行されたフラグメントに含まれません)。

OPは、そのようなコードで何をしようとしているのかを述べていないため、必要なのはフラグメントのセットだけかもしれません。コードと必要な宣言を抽出したい場合は、必要な宣言を判断できる、より洗練されたツールが必要になります。ソース コード用の完全なパーサーと名前リゾルバーを備えたプログラム変換ツールは、これに必要な機能を提供できます。これは、アドホック抽出テキスト抽出を使用してカバレッジ ツールをテストするよりも、使用するのがかなり複雑です。

于 2014-01-09T23:07:15.263 に答える
1

この問題を解決する適切な方法は、LibreOffice がオープン ソースであることを思い出すことです。ソースコード全体が文書化されており、 docs.libreoffice.orgで文書を参照できます。難しい方法でそれをしないでください:)

さらに、プリンター設定ダイアログは LibreOffice 固有のものではなく、OS によって提供されることに注意してください。

于 2014-01-09T22:19:49.030 に答える