LibreOffice: определить часть исходного кода, отвечающую за печать

Я пытаюсь реализовать некоторые дополнительные функции в процессе печати LibreOffice (некоторая специальная информация должна автоматически добавляться на поля каждой печатной страницы). Я использую RHEL 6.4 с LibreOffice 4.0.4 и Gnome 2.28.

Моя цель — исследовать поток данных между LibreOffice и системными компонентами и определить, какие исходные коды отвечают за печать. После этого мне придется изменить эти части кода.

Теперь мне нужен совет по методам исследования исходного кода. Я нашел множество инструментов и с моей точки зрения:

  1. strace кажутся очень низкоуровневыми;
  2. gprof требует перекомпиляции двоичных файлов с параметром CFLAGS "-pg"; понятия не имею, как это сделать с 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

и получил четыре выходных файла:

-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 Writer (я определил его с помощью strace и ps aux). Я нажал CTRL+P и кнопку OK. Затем я закрыл приложение в надежде увидеть в логах функцию, отвечающую за инициализацию процесса печати.

Вывод callgrind был обработан инструментом Gprof2Dot в соответствии с этим ответом. К сожалению, я не вижу на картинке ни интересующих меня действий, ни графа вызовов как есть.

Буду признателен за любую информацию о правильном способе решения такой проблемы. Спасибо.

введите здесь описание изображения


person Vitaly Isaev    schedule 09.01.2014    source источник


Ответы (2)


Правильный способ решения этой проблемы — помнить, что LibreOffice имеет открытый исходный код. Весь исходный код задокументирован, и вы можете просмотреть документацию по адресу docs.libreoffice.org. Не делайте этого сложно :)

Кроме того, помните, что диалоговое окно настройки принтера не зависит от LibreOffice, а предоставляется операционной системой.

person Stefano Sanfilippo    schedule 09.01.2014

Вам нужен инструмент для идентификации интересующего вас исходного кода. Эту информацию могут предоставить инструменты Test Coverage (TC).

Что делают инструменты TC, так это определяют, какие фрагменты кода выполнялись при выполнении программы; думайте об этом как о наборе областей кода. Обычно инструменты TC используются в сочетании с (интерактивными/модульными/интеграционными/системными) тестами, чтобы определить, насколько эффективны тесты. Если был выполнен только небольшой объем кода (как это обнаружено инструментом TC), тесты интерпретируются как неэффективные или неполные; если был покрыт большой процент, у вас есть хорошие тесты и разумное обоснование для отправки продукта (при условии, что все тесты пройдены).

Но вы можете использовать инструменты TC, чтобы найти код, реализующий функции. Во-первых, вы выполняете некоторый тест (или, возможно, вручную управляете программным обеспечением), чтобы проверить интересующую вас функцию и собрать данные TC. Это сообщает вам набор всего кода, который используется, если функция используется; это завышение интересующего вас кода. Затем вы запускаете программу, прося ее сделать что-то похожее, но не реализующее эту функцию. Это идентифицирует набор кода, который определенно не реализует функцию. Вычислите установленную разницу кода, выполняемого с функцией, и ... без, чтобы определить код, который больше ориентирован на поддержку функции.

Вы, естественно, можете получить более узкие границы, запустив больше функций-упражнений и больше функций-не-упражнений и вычислив различия в объединениях этих наборов.

Существуют инструменты TC для C++, например, "gcov". Я думаю, что большинство из них не позволят/не помогут вам вычислить такие различия множества по результатам; похоже, что многие инструменты ТС не поддерживают работу с покрытыми множествами. (Моя компания производит семейство инструментов TC, которые имеют эту возможность, включая вычисление различий между наборами покрытия, включая C++).

Если вы действительно хотите извлечь соответствующий код, инструменты ТС этого не сделают. Они просто сообщают вам, что такое код, обозначая текстовые области в исходных файлах. Большинство инструментов тестового покрытия сообщают только о пройденных строках как о таких текстовых областях; отчасти это связано с тем, что механизмы, используемые многими инструментами покрытия тестами, ограничены номерами строк, записанными компилятором.

Тем не менее, можно иметь инструменты тестового покрытия, которые точно сообщают текстовые области с точки зрения начального файла/строки/столбца до конечного файла/строки/столбца (кхм, инструменты моей компании делают это). Имея эту информацию, довольно просто создать простую программу для чтения исходных файлов и извлечения буквально исполняемого кода. (Это не означает, что извлеченный код является правильно сформированной программой! Например, объявления данных не будут включены в исполняемые фрагменты, хотя они необходимы).

ОП не говорит, что он собирается делать с таким кодом, поэтому набор фрагментов может быть всем, что нужно. Если он хочет извлечь код и необходимые объявления, ему потребуются более сложные инструменты, которые могут определить необходимые объявления. Средства преобразования программ с полными синтаксическими анализаторами и преобразователями имен для исходного кода могут предоставить необходимые возможности для этого. Это значительно сложнее в использовании, чем просто инструменты тестового покрытия с извлечением текста ad hoc.

person Ira Baxter    schedule 09.01.2014