Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Christian Junker Newsgroups: de.comp.lang.python Subject: Re: [Python-de] Tracing der Funktionsaufrufe in Python Date: Thu, 3 Nov 2016 22:01:44 +0100 Lines: 140 Message-ID: References: <18704592-f31d-23b9-de4a-f29ea6a5e9fa@behnel.de> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Trace: news.uni-berlin.de 1oTK07+rm+2td73EFRaguQD5QKhiMqd8MW8vG1fQnkrA== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-transfer-encoding; bh=eyEmsYwTi9HazGSgKssyiKqSdWL1aLzAS0pZksmlw8w=; b=gomvlxwAvn7J5GC4l0ReIrPx7PnY+Tf26JsBrajt1srdHUNfgq9g+fnrIH6OA1+bkP piB3oThFLHFOJ9sE/W0+y9c+pUlI+z8Zjz+mkIjXcxYgZzIrBcRCJzoxXldWqHmj5dI1 N6hHbHlDbnu42GSoabamSVgefxlPmtOnPT4LT7w7t9hkG6DMGGK0sqUtiP4Cz+0NDn6b cH3Q8dsEPO+IVqtSNp8O010a3QMz9cvqjldnpr49jVv44cgiUIDkRuTV7htDK1ldMVRo 5XxQ/i5lbiPoudyy7yY6395fJvGRfgDvdIua1JTA0skflH5X7MBuZyle+NukdmdZ+i+y U8Hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:content-transfer-encoding; bh=eyEmsYwTi9HazGSgKssyiKqSdWL1aLzAS0pZksmlw8w=; b=EwcbCzgTeENBqaKYHoMr09eG9W5AXgoJk6ufN2+UAoRZl28iU+p0JyHAJkseH8g2kJ U/risOJS2SUjBFJ1L4NTYj0hhH3WL9Mcw6/TozyuvXii2AJpRBNn0VFwODH9P+yu9wD2 zukbc39ETgxhkz3SDCjhlX5M/VNVEjuzcSgdj7vz24hwSOTKhFhu0KFSc5ffgCsd7W3K Y8XxWOVe6g/JIOILwu83Y1vuwT59/HpUvF3fXkeCVEHW5AQ+Vw7qjXj6o+8/H6cvtOr1 pWVNXrv8aPMYsqogDV9v+VeQ3be82vAszDMfMuUzUWIcq/kyaD1nfk3sS+cfk0gwGl0W KUNA== X-Gm-Message-State: ABUngvcg8uOAfbP5i9Jmbdd+UhvC8J6F+CDsWKqZq5bK6AuxWQJdLupHN6cVQ0sLX/FbEeHpfm76lOcPORglPQ== X-Received: by 10.107.35.11 with SMTP id j11mr10433791ioj.68.1478206904886; Thu, 03 Nov 2016 14:01:44 -0700 (PDT) In-Reply-To: <18704592-f31d-23b9-de4a-f29ea6a5e9fa@behnel.de> X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: X-Mailman-Original-References: <18704592-f31d-23b9-de4a-f29ea6a5e9fa@behnel.de> Xref: csiph.com de.comp.lang.python:4578 Hallo Stefan, ich bin beruflich sehr stark auf Windows NT unterwegs. In den industriellen Gro=C3=9Fprojekten im PDM/PLM Umfeld besteht zum einen die Transition von kommerziellen Unix Servern, wie Solaris, hin zu Linux, zum anderen ist der Betrieb von Windows Server Distributionen h=C3=A4ufig anzutreffen (besonders f=C3=BCr neuere Projekte im Mittelstand (KMU), z.B. einer PLM Systemeinf=C3=BChrung, wo es evt. keine Unix/Linux Administratoren gibt). Insofern sind mir das ein oder andere Mal die H=C3=A4nde gebunden, wenn es um Monitoring und Profiling Werkzeuge geht, die die Interna der Software sichtbar machen. Das einzige Tool, das ich unter Windows als Sampling Profiler n=C3=BCtzlich finde, ist verysleepy. Es funktioniert allerdings nicht so gut f=C3=BCr den Python Interpreter. Die Gr=C3=BCnde f=C3=BCr meine Anfrage sind unterschiedlicher Natur: Zum einen geht es ganz konkret um ein besseres Verst=C3=A4ndnis der Python C API, auch weil ich zu den gro=C3=9Fen PLM APIs kein direktes Python Binding habe. Ich kann mir Python hier nicht nur als Automatisierungstool f=C3=BCr gro=C3=9Fe Datenmigrationen vorstellen, sonde= rn auch als Test Framework, um gewisse Grundfunktionalit=C3=A4ten des oftmals stark gecustomizeten/erweiterten Systems effizient testen zu k=C3=B6nnen. Vor einiger Zeit hatte ich solch ein Toolkit begonnen, damals mit cffi. Zum anderen ist es der Reiz auch f=C3=BCr Python hinter die B=C3=BChne zu s= ehen. Ich teile die Meinung nicht, dass man aus Gr=C3=BCnden der Komplexit=C3=A4t= die Finger von C Extensions lassen sollte, auch wenn Cython und boost python sicher ihren Charme haben. Ich kann mir auch gut vorstellen, dass die so erm=C3=B6glichte Transparenz f=C3=BCr Schulungszwecke genutzt w= erden kann, um Studenten neben Python auch C als wichtige Programmiersprache zu vermitteln. Dass der Python-Interpreter im debug Modus so viel ausdruckt, aber den Call Stack in C nicht, kann ich jedenfalls nicht verstehen. Ein weiterer Punkt d=C3=BCrfte all jene betreffen, die Python in ihrer C++ Applikation embedden m=C3=B6chten. Ich habe mit cffi, ctypes und anderen Modulen z.B. das Problem, dass ich wrapper Funktionen in C implementieren muss, weil ich C++ Klassen und Methoden nicht direkt nutzen kann. BTW: K=C3=A4me es nicht auch der Entwicklung des Cython Cores entgegen? Schlie=C3=9Flich muss der ja die Python Skripte in C Code umwandeln. Und das geht ja an vielen Stellen nur durch ein tiefes Wissen =C3=BCber die Python C API. Statt hierf=C3=BCr st=C3=A4ndig auf externe Tools wie callgri= nd zur=C3=BCckgreifen zu m=C3=BCssen, w=C3=A4re es doch f=C3=BCr den typischen= iterativen Round Trip an Entwicklungsaufgaben sch=C3=B6ner, die C Funktionen direkt im Interpreter zu sehen, sobald man eine Funktion interaktiv aufruft. Am 3. November 2016 um 20:32 schrieb Stefan Behnel : > Hallo Christian! > > Christian Junker schrieb am 03.11.2016 um 11:57: >> ich interessiere mich daf=C3=BCr, welche Python Funktion/Methode welche = C >> Funktionen im Kern des CPython Interpreters aufruft (voller Call >> Stack) und zus=C3=A4tzlich auch f=C3=BCr das Profiling dieser C Funktion= en. > > Interessiert dich das nur einfach mal so, oder verfolgst du damit irgende= in > Ziel? > > >> Leider konnte ich bisher f=C3=BCr diesen Zweck kein Modul finden. >> >> Nehmen wir das Beispiel der print Funktion in Python3. Letztlich ruft >> diese, wenn ich den Source Code CPythons richtig verstehe die Funktion >> builtin_print (definiert in Python/bltinmodule.c) auf. Diese Funktion >> wiederum nutzt Funktionen aus der Python C API, wie bspw. >> PyArg_ParseTupleAndKeywords zum Auslesen der =C3=BCbergebenen Parameter, >> oder PyFile_WriteObject zum Schreiben des Inputs in den entsprechenden >> Outputstream. PyFile_WriteObject wiederum holt sich das Attribut >> "write" des Outputstream Objekts und ruft dann PyEval_CallObject >> darauf auf, usw. > > print() ist vielleicht nicht das interessanteste f=C3=BCr's Profiling, ab= er im > Wesentlichen stimmt das, was du schreibst (zumindest vor CPython 3.6, das > f=C3=BCr die Funktionseinstiegspunkte im Build besseren Code generiert al= s die > "PyArg_*" Funktionsaufrufe). > > >> Ein Modul, das mir diesen Function Stack transparent machen plus ein >> bis auf die C Ebene aufgeschl=C3=BCsseltes Profiling anbieten w=C3=BCrde= , w=C3=A4re >> eine feine Sache. >> Bisher habe ich mich ohne Erfolg an pdb, vmprof, dem Bauen CPythons >> mit dem debug flag und ltrace versucht. Sicherlich g=C3=A4be es die >> M=C3=B6glichkeit mittels gdb oder valgrind an diese Call Stacks >> heranzukommen, aber diese Tools sind nicht gerade leichtgewichtig. >> >> Kennt jemand m=C3=B6gliche Techniken / Module, die mir dies erm=C3=B6gli= chen, >> oder ist es wirklich nur durch Studium des Interpreter-Quellcodes >> m=C3=B6glich? > > Unter Linux verwende ich f=C3=BCr solche Sachen entweder callgrind (Profi= ler in > valgrind) zusammen mit Kcachegrind zur Visualisierung, oder perf. > > Letzteres ist ein recht leicht zu benutzender statistischer Profiler, bei > dem du per Text-Interface durch die Aufrufe hindurch springen kannst. > > callgrind liefert dir dagegen ein komplettes Laufprofil, braucht dadurch > etwas l=C3=A4nger, aber bietet mit Kcachegrind eine schicke grafische Obe= rfl=C3=A4che > zum Hineinklicken. Um zu verstehen, was vor sich geht, ist das eins der > besten (kostenfreien) Tools, die ich kenne. Wichtig ist, dass du bei > callgrind per "--toggle-collect=3DNAME" einen Funktionsnamen angeben kann= st, > innerhalb der der Profiler angeworfen wird. Alles andere wird dann > ignoriert und verschwendet keine Laufzeit. > > Ansonsten gibt es auch noch Intels vprof, f=C3=BCr das OSS-Entwickler unt= er > bestimmten Umst=C3=A4nden eine kostenlose Lizenz bekommen k=C3=B6nnen. Is= t recht gut > und verbindet die Vorteile der Tools oben (statistisch + grafisch), aber > die beiden tun's im Wesentlichen auch, je nach Anwendungsfall. > > Stefan > > _______________________________________________ > python-de maillist - python-de@python.org > https://mail.python.org/mailman/listinfo/python-de --=20 Mit freundlichen Gr=C3=BC=C3=9Fen/best regards Christian Junker