2016-10-16 4 views
12

Ich profile einige Multi-Prozess-Nodejs-Code unter OSX ausgeführt.Was ist das ___mac_get_pid-Symbol in einem Knotenprofil?

Ich sehe:

[C++]: 
    ticks total nonlib name 
    23398 63.6% 63.8% ___mac_get_pid 

Was ___mac_get_pid ist? Sein Name ist sicherlich suggestiv, dass es ein Code ist, der "eine PID auf einem Mac bekommt", aber die Zeit scheint übertrieben.

Googeln hat nichts nützliches zur Verfügung gestellt.

+0

@closevoter können Sie Ihre Bedenken zu dieser Frage angeben? Es ist eine legitime Frage, nach der ich suche und antworte, und ich würde sie gerne verbessern, wenn möglich. – Dancrumb

+0

Dancrumb, Was ist dein Profiler und wie hast du angefangen? Gibt es einen Profiler, der Callstack aufzeichnen kann? Oder versuchen Sie, die Anwendung mehrmals im Debugger (gdb/lldb) zu stoppen und überprüfen Sie die Rückverfolgung, wenn Sie auf die '__mac_get_pid' klicken, um zu wissen, wer sie aufgerufen hat. Was ist Ihr Betriebssystem und was hat Ihre Anwendung? Gibt es Prozesslistenfunktionen? Welche Bibliotheken benutzen Sie? – osgx

+0

Dancrumb, haben Sie andere Funktionen im Profil aufgeführt? Können Sie mehr Teile des Profils, sowohl C/C++ als auch Knotenfunktionen, posten? Einige von ihnen geben Hinweise auf ___mac_get_pid; möglicherweise ist es mit dem Warten auf einige Prozesse/Threads und/oder Verbindungen verbunden (oder es kann ein Timeout in der Nähe davon sein). Welche Bibliotheken/Muster verwenden Sie, um mehrere Prozesse miteinander zu verbinden und Nachrichten auszutauschen? Haben Sie ein sort nodejs Beispiel, um die Situation zu reproduzieren? Was sind Versionen von OSX/macOS und nodejs? – osgx

Antwort

3

__mac_get_pid ist der Syscall hinter mac_get_pid Bibliotheksfunktion. Es ist mac_get in Manpage beschrieben: http://man.cx/mac_get(3)

mac_get_pid .. erhalten das Etikett einer Datei, Buchse, Buchse Peer oder Prozess Die mac_get_pid() und mac_get_proc() Systemaufrufe des Prozesses Label verknüpft mit einer beliebigen Rück Prozess-ID oder der aktuelle Prozess.

Etikettenspeicher für diese Anrufe müssen zuerst mithilfe der mac_prepare (3) -Funktionen zugewiesen und vorbereitet werden. Wenn eine Anwendung ein Label verwendet, kann der Speicher unter Verwendung von mac_free (3) zurückgegeben werden.

Die "MAC" hier ist nicht Mac OS X/macOS, aber POSIX.1e ‚s Mandatory Access Control ("wurde in FreeBSD 5.0 ​​als Teil des TrustedBSD Projekt eingeführt"). Die mac_get_pid ist implemented in macOS/Dawrin/XNU als "Erweiterte Nicht-POSIX.1e-Schnittstellen".

Möglicherweise gibt es einige Methoden in den Bibliotheken von nodejs, die versuchen, detaillierte Arbeit mit Prozesslisten zu machen (wie ps/top), aber sie konnten die Geschwindigkeit ihrer Anfragen nicht begrenzen. Getting mehrere Stacktraces mit mac_get_pid entweder mit Profiler (nicht v8 profiler die Stacktraces nur js, aber einige externe Profiler mit Nodejs Prozess verbunden) oder mit Debugger (GDB/Lldb) durch manuelle stoppen und überprüfen, bis Sie wer Anrufe mac_get_pid (weiter und wieder zu stoppen Wenn Sie nicht in mac_get_pid sind) ist der erforderliche Schritt, um herauszufinden, wer es genannt hat.

+0

2003 Papier auf TrustedBSD Design: http://www.trustedbsd.org/trustedbsd-usenix2003freenix.pdf "Das TrustedBSD MAC Framework: Erweiterbare Kernel Access Control für FreeBSD 5.0": "* ... Label Management Bibliotheks- und Systemaufrufe, mit denen Anwendungen auf mit MAC-Etiketten und -Elementen in einer abstrakten Art und Weise umgehen können Rufen Sie die Bezeichnung des aktuellen oder beliebigen Prozesses ab; legen Sie das aktuelle Prozesslabel fest. Mac_get_pid() * ". MAC-Verwaltung kann auch für das Login/Autorisierungsmanagement benötigt werden ... – osgx