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

Опитвам се да внедря някаква допълнителна функционалност към процеса на печат на LibreOffice (някаква специална информация трябва да се добавя автоматично към полетата на всяка отпечатана страница). Използвам RHEL 6.4 с LibreOffice 4.0.4 и Gnome 2.28.

Моята цел е да проуча потока от данни между 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

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

-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) съответства на работещото GUI приложение 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

Това, което искате, е инструмент за идентифициране на изходния код, който ви интересува. Инструментите за тестово покритие (TC) могат да предоставят тази информация.

Това, което TC инструментите правят, е да определят кои кодови фрагменти са изпълнени, когато програмата се упражнява; мислете за това като за събиране като набор от кодови региони. Обикновено инструментите за TC се използват във връзка с (интерактивни/единични/интеграционни/системни) тестове, за да се определи колко ефективни са тестовете. Ако е изпълнено само малко количество код (както е открито от TC инструмента), тестовете се интерпретират като неефективни или непълни; ако е покрит голям процент, има добри тестове и разумна обосновка за изпращане на продукта (ако приемем, че всички тестове са преминали).

Но можете да използвате TC инструменти, за да намерите кода, който внедрява функции. Първо, изпълнявате някакъв тест (или може би ръчно управлявате софтуера), за да упражните функцията, която ви интересува, и събирате TC данни. Това ви казва набора от целия упражнен код, ако функцията се използва; това е надценяване на кода, който ви интересува. След това упражнявате програмата, като я молите да извърши някаква подобна дейност, но която не упражнява функцията. Това идентифицира набор от код, който определено не изпълнява функцията. Изчислете зададената разлика на кода-използван-с-функция и ...-без, за ​​да определите кода, който е по-фокусиран върху поддържането на функцията.

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

Има TC инструменти за C++, например "gcov". Мисля, че повечето от тях няма да ви позволят/помогнат да изчислите такива разлики в набора върху резултатите; много TC инструменти изглежда нямат никаква поддръжка за манипулиране на покрити набори. (Моята компания прави семейство от TC инструменти, които имат тази възможност, включително разлики в набора от изчислителни покрития, включително C++).

Ако наистина искате да извлечете съответния код, TC инструментите не правят това. Те просто ви казват какъв код, като обозначават текстови области в изходните файлове. Повечето инструменти за тестово покритие отчитат само покрити редове като такива текстови области; това отчасти се дължи на факта, че използваните от много инструменти за тестово покритие машини са ограничени до номера на редове, записани от компилатора.

Човек обаче може да има инструменти за тестово покритие, които са прецизни при отчитане на текстови региони по отношение на началния файл/ред/колона до крайния файл/ред/колона (хм, инструментите на моята компания случайно правят това). С тази информация е доста лесно да се създаде проста програма за четене на изходни файлове и буквално извличане на кода, който е бил изпълнен. (Това не означава, че извлеченият код е добре оформена програма! например, декларациите за данни няма да бъдат включени в изпълнените фрагменти, въпреки че са необходими).

OP не казва какво възнамерява да прави с такъв код, така че наборът от фрагменти може да е всичко, което е необходимо. Ако иска да извлече кода и необходимите декларации, ще му трябват по-сложни инструменти, които могат да определят необходимите декларации. Инструментите за програмна трансформация с пълни парсери и преобразуватели на имена за изходния код могат да осигурят необходимата възможност за това. Това е значително по-сложно за използване, отколкото просто тестови инструменти за покритие с извличане на ad hoc извличане на текст.

person Ira Baxter    schedule 09.01.2014