Frage

Ich versuche, einige zusätzliche Funktionen für den LibreOffice-Druckprozess zu implementieren (einige spezielle Informationen sollten automatisch an den Rändern jeder gedruckten Seite hinzugefügt werden).Ich verwende RHEL 6.4 mit LibreOffice 4.0.4 und Gnome 2.28.

Mein Ziel ist es, den Datenfluss zwischen LibreOffice und Systemkomponenten zu untersuchen und festzustellen, welche Quellcodes für den Druck verantwortlich sind.Danach muss ich diese Teile des Codes ändern.

Jetzt brauche ich einen Rat zu den Methoden der Quellcodeforschung.Ich habe viele Werkzeuge gefunden und aus meiner Sicht:

  1. strace scheint sehr niedrig zu sein;
  2. gprof erfordert Binärdateien, die mit CFLAGS "-pg" neu kompiliert wurden;habe keine Ahnung, wie es mit LibreOffice geht;
  3. systemtap kann nur Syscalls untersuchen, nicht wahr?
  4. callgrind + Gprof2Dot sind ziemlich gut zusammen, führen aber seltsame Ergebnisse aus (siehe unten);

Zum Beispiel hier ist das Anrufdiagramm von callgrind ausgabe mit Gprof2Dot Visualisierung.Ich habe angefangen callgrind mit einem solchen Befehl:

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

und erhielt vier Ausgabedateien:

-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

Die letzte (pid 29812) entspricht der laufenden LibreOffice Writer-GUI-Anwendung (ich habe sie mit ermittelt strace und ps aux).Ich drückte STRG+P und OK-Taste.Dann habe ich die Anwendung geschlossen, in der Hoffnung, die Funktion zu sehen, die für die Initialisierung des Druckprozesses in Protokollen verantwortlich ist.

Der callgrind ausgabe wurde mit einem verarbeitet Gprof2Dot werkzeug nach dieser Antwort.Leider kann ich auf dem Bild weder die Aktionen sehen, an denen ich interessiert bin, noch das Anrufdiagramm so wie es ist.

Ich freue mich über jede Information über die richtige Lösung eines solchen Problems.Danke.

enter image description here

War es hilfreich?

Lösung

Der richtige Weg, um dieses Problem zu lösen, besteht darin, sich daran zu erinnern, dass LibreOffice Open Source ist.Der gesamte Quellcode ist dokumentiert und Sie können die Dokumentation unter durchsuchen docs.libreoffice.org.Mach das nicht auf die harte Tour :)

Denken Sie außerdem daran, dass der Dialog zur Druckereinrichtung nicht LibreOffice-spezifisch ist, sondern vom Betriebssystem bereitgestellt wird.

Andere Tipps

Was Sie wollen, ist ein Werkzeug, um den interessierenden Quellcode zu identifizieren.Tools zur Testabdeckung (TC) können diese Informationen bereitstellen.

Was TC Tools tun, ist festzustellen, welche Codefragmente ausgeführt wurden, wenn das Programm ausgeführt wird;stellen Sie es sich als Sammlung von Coderegionen vor.Normalerweise werden TC-Tools in Verbindung mit (interaktiven / Unit- / Integrations- / System-) Tests verwendet, um festzustellen, wie effektiv die Tests sind.Wenn nur eine geringe Menge Code ausgeführt wurde (wie vom TC-Tool erkannt), werden die Tests als unwirksam oder unvollständig interpretiert;wenn ein großer Prozentsatz abgedeckt wurde, hat man gute Tests und eine vernünftige Begründung für den Versand des Produkts (vorausgesetzt, alle Tests wurden bestanden).

Sie können jedoch TC-Tools verwenden, um den Code zu finden, der Funktionen implementiert.Zuerst führen Sie einen Test durch (oder fahren die Software möglicherweise manuell), um die gewünschte Funktion auszuführen und TC-Daten zu sammeln.Dies zeigt Ihnen die Menge des gesamten ausgeübten Codes, wenn die Funktion verwendet wird;es ist eine Überschätzung des für Sie interessanten Kodex.Dann üben Sie das Programm aus und bitten es, eine ähnliche Aktivität auszuführen, die jedoch die Funktion nicht ausübt.Dies identifiziert den Codesatz, der die Funktion definitiv nicht implementiert.Berechnen Sie die Mengendifferenz des mit Feature ausgeübten Codes und ...-ohne Code zu bestimmen, der sich mehr auf die Unterstützung der Funktion konzentriert.

Sie können natürlich engere Grenzen setzen, indem Sie mehr Übungsfunktionen und mehr Übungsfunktionen ausführen und Unterschiede über Vereinigungen dieser Sätze berechnen.

Es gibt TC-Tools für C ++, z. B. "gcov".Ich denke, die meisten von ihnen lassen sich solche Mengenunterschiede über die Ergebnisse nicht berechnen / helfen;viele TC-Tools scheinen keine Unterstützung für die Manipulation abgedeckter Sets zu haben.(Mein Unternehmen stellt eine Familie von TC-Tools her, die über diese Funktion verfügen, einschließlich Unterschiede bei der Rechenabdeckung, einschließlich C ++).

Wenn du wirklich willst extrahieren der relevante Code, TC Tools, macht das nicht.Sie sagen Ihnen lediglich, welchen Code Sie verwenden, indem sie Textregionen in Quelldateien angeben.Die meisten Testabdeckungstools berichten nur abgedeckt Lines als solche Textregionen;dies liegt zum Teil daran, dass die Maschinerie, die viele Testabdeckungstools verwenden, auf Zeilennummern beschränkt ist, die vom Compiler aufgezeichnet wurden.

Man kann jedoch Testabdeckungstools verwenden, die präzise Textregionen in Bezug auf den Start von Datei / Zeile / Spalte bis zum Ende von Datei / Zeile / Spalte melden (ähm, die Tools meines Unternehmens tun dies zufällig).Mit diesen Informationen ist es ziemlich einfach, ein einfaches Programm zum Lesen von Quelldateien zu erstellen und buchstäblich den ausgeführten Code zu extrahieren.(Dies bedeutet nicht, dass der extrahierte Code ein wohlgeformtes Programm ist!zum Beispiel werden die Datendeklarationen nicht in die ausgeführten Fragmente aufgenommen, obwohl sie notwendig sind).

OP sagt nicht, was er mit einem solchen Code vorhat, daher ist der Satz von Fragmenten möglicherweise alles, was benötigt wird.Wenn er den Code und die erforderlichen Deklarationen extrahieren möchte, benötigt er ausgefeiltere Tools, die die erforderlichen Deklarationen ermitteln können.Programmtransformationswerkzeuge mit vollständigen Parsern und Namensauflösern für Quellcode können hierfür die erforderlichen Funktionen bereitstellen.Dies ist wesentlich komplizierter zu verwenden als nur Testabdeckungswerkzeuge mit Ad-hoc-Extraktion Textextraktion.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top