2015-11-19 23 views
30

Während iosnoop Befehl auf OSX 10.11.1 läuft ich einen Fehler mit dem folgenden Text erhalten:iosnoop, iotop, opensnoop, execsnoop, opensnoop, dtruss und andere dtrace basierte Befehle funktionieren nicht auf osx El Capitan, macOS Sierra

dtrace: invalid probe specifier 
/* 
    * Command line arguments 
    */ 
inline int OPT_dump = 0; 
inline int OPT_device = 0; 
inline int OPT_delta = 0; 
inline int OPT_devname = 0; 
inline int OPT_file = 0; 
inline int OPT_args = 0; 
inline int OPT_ins  = 0; 
inline int OPT_nums = 0; 
inline int OPT_dtime = 0; 
inline int OPT_mount = 0; 
inline int OPT_start = 0; 
inline int OPT_pid  = 0; 
inline int OPT_name = 0; 
inline int OPT_end  = 0; 
inline int OPT_endstr = 0; 
inline int FILTER = 0; 
inline int PID  = 0; 
inline string DEVICE = "."; 
inline string FILENAME = "."; 
inline string MOUNT = "."; 
inline string NAME  = "."; 

#pragma D option quiet 
#pragma D option switchrate=10hz 

/* 
    * Print header 
    */ 
dtrace:::BEGIN 
{ 
    last_event[""] = 0; 

    /* print optional headers */ 
    OPT_start ? printf("%-14s ","STIME") : 1; 
    OPT_end  ? printf("%-14s ","TIME") : 1; 
    OPT_endstr ? printf("%-20s ","STRTIME") : 1; 
    OPT_devname ? printf("%-7s ","DEVICE") : 1; 
    OPT_ins  ? printf("%-3s ","INS")  : 1; 
    OPT_nums ? printf("%-3s %-3s ","MAJ","MIN") : 1; 
    OPT_delta ? printf("%-10s ","DELTA") : 1; 
    OPT_dtime ? printf("%-10s ","DTIME") : 1; 

    /* print main headers */ 
    OPT_dump ? 
     printf("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\n", 
     "TIME", "STIME", "DELTA", "DEVICE", "INS", "MAJ", "MIN", "UID", 
     "PID", "PPID", "D", "BLOCK", "SIZE", "MOUNT", "FILE", "PATH", 
     "COMM","ARGS") : 
     printf("%5s %5s %1s %8s %6s ", "UID", "PID", "D", "BLOCK", "SIZE"); 
    OPT_args == 0 ? printf("%10s %s\n", "COMM", "PATHNAME") : 1; 
    OPT_args == 1 ? printf("%28s %s\n", "PATHNAME", "ARGS") : 1; 
} 

/* 
    * Check event is being traced 
    */ 
io:::start 
{ 
    /* default is to trace unless filtering, */ 
    self->ok = FILTER ? 0 : 1; 

    /* check each filter, */ 
    (OPT_device == 1 && DEVICE == args[1]->dev_statname)? self->ok = 1 : 1; 
    (OPT_file == 1 && FILENAME == args[2]->fi_pathname) ? self->ok = 1 : 1; 
    (OPT_mount == 1 && MOUNT == args[2]->fi_mount) ? self->ok = 1 : 1; 
    (OPT_name == 1 && NAME == strstr(NAME, execname)) ? self->ok = 1 : 1; 
    (OPT_name == 1 && execname == strstr(execname, NAME)) ? self->ok = 1 : 1; 
    (OPT_pid == 1 && PID == pid) ? self->ok = 1 : 1; 
} 

/* 
    * Reset last_event for disk idle -> start 
    * this prevents idle time being counted as disk time. 
    */ 
io:::start 
/! pending[args[1]->dev_statname]/ 
{ 
    /* save last disk event */ 
    last_event[args[1]->dev_statname] = timestamp; 
} 

/* 
    * Store entry details 
    */ 
io:::start 
/self->ok/ 
{ 
    /* these are used as a unique disk event key, */ 
    this->dev = args[0]->b_edev; 
    this->blk = args[0]->b_blkno; 

    /* save disk event details, */ 
    start_uid[this->dev, this->blk] = (int)uid; 
    start_pid[this->dev, this->blk] = pid; 
    start_ppid[this->dev, this->blk] = ppid; 
    start_args[this->dev, this->blk] = (char *)curpsinfo->pr_psargs; 
    start_comm[this->dev, this->blk] = execname; 
    start_time[this->dev, this->blk] = timestamp; 

    /* increase disk event pending count */ 
    pending[args[1]->dev_statname]++; 

    self->ok = 0; 
} 

/* 
    * Process and Print completion 
    */ 
io:::done 
/start_time[args[0]->b_edev, args[0]->b_blkno]/ 
{ 
    /* decrease disk event pending count */ 
    pending[args[1]->dev_statname]--; 

    /* 
    * Process details 
    */ 

    /* fetch entry values */ 
    this->dev = args[0]->b_edev; 
    this->blk = args[0]->b_blkno; 
    this->suid = start_uid[this->dev, this->blk]; 
    this->spid = start_pid[this->dev, this->blk]; 
    this->sppid = start_ppid[this->dev, this->blk]; 
    self->sargs = (int)start_args[this->dev, this->blk] == 0 ? 
     "" : start_args[this->dev, this->blk]; 
    self->scomm = start_comm[this->dev, this->blk]; 
    this->stime = start_time[this->dev, this->blk]; 
    this->etime = timestamp; /* endtime */ 
    this->delta = this->etime - this->stime; 
    this->dtime = last_event[args[1]->dev_statname] == 0 ? 0 : 
     timestamp - last_event[args[1]->dev_statname]; 

    /* memory cleanup */ 
    start_uid[this->dev, this->blk] = 0; 
    start_pid[this->dev, this->blk] = 0; 
    start_ppid[this->dev, this->blk] = 0; 
    start_args[this->dev, this->blk] = 0; 
    start_time[this->dev, this->blk] = 0; 
    start_comm[this->dev, this->blk] = 0; 
    start_rw[this->dev, this->blk] = 0; 

    /* 
    * Print details 
    */ 

    /* print optional fields */ 
    OPT_start ? printf("%-14d ", this->stime/1000) : 1; 
    OPT_end  ? printf("%-14d ", this->etime/1000) : 1; 
    OPT_endstr ? printf("%-20Y ", walltimestamp) : 1; 
    OPT_devname ? printf("%-7s ", args[1]->dev_statname) : 1; 
    OPT_ins  ? printf("%3d ", args[1]->dev_instance) : 1; 
    OPT_nums ? printf("%3d %3d ", 
     args[1]->dev_major, args[1]->dev_minor) : 1; 
    OPT_delta ? printf("%-10d ", this->delta/1000) : 1; 
    OPT_dtime ? printf("%-10d ", this->dtime/1000) : 1; 

    /* print main fields */ 
    OPT_dump ? 
     printf("%d %d %d %s %d %d %d %d %d %d %s %d %d %s %s %s %s %S\n", 
     this->etime/1000, this->stime/1000, this->delta/1000, 
     args[1]->dev_statname, args[1]->dev_instance, args[1]->dev_major, 
     args[1]->dev_minor, this->suid, this->spid, this->sppid, 
     args[0]->b_flags & B_READ ? "R" : "W", 
     args[0]->b_blkno, args[0]->b_bcount, args[2]->fi_mount, 
     args[2]->fi_name, args[2]->fi_pathname, self->scomm, self->sargs) : 
     printf("%5d %5d %1s %8d %6d ", 
     this->suid, this->spid, args[0]->b_flags & B_READ ? "R" : "W", 
     args[0]->b_blkno, args[0]->b_bcount); 
    OPT_args == 0 ? printf("%10s %s\n", self->scomm, args[2]->fi_pathname) 
     : 1; 
    OPT_args == 1 ? printf("%28s %S\n", 
     args[2]->fi_pathname, self->sargs) : 1; 

    /* save last disk event */ 
    last_event[args[1]->dev_statname] = timestamp; 

    /* cleanup */ 
    self->scomm = 0; 
    self->sargs = 0; 
} 

/* 
    * Prevent pending from underflowing 
    * this can happen if this program is started during disk events. 
    */ 
io:::done 
/pending[args[1]->dev_statname] < 0/ 
{ 
    pending[args[1]->dev_statname] = 0; 
} 
: probe description io:::start does not match any probes 

Getestet auf zwei Maschinen, die die gleiche Version von OSX ausführen und den gleichen Fehler haben. Auch am 10.10 getestet und es funktionierte wie es sollte.

Antwort

15

Gefunden die Lösung von here.

Wie sich herausstellt, hat der Benutzer root in osx elcapitan keinen vollen Zugriff auf den Computer. Um dieses Verhalten zu ändern, müssen Sie den Computer neu starten und den Befehl Befehl + R während des Startens halten, um in den Wiederherstellungsmodus zu gelangen. Öffnen Sie das Terminal vom oberen Menü-> Dienstprogramm-> Terminal und führen Sie den Befehl 'csrutil disable' aus. Dann starte deinen Computer neu. Jetzt sollten Sie in der Lage sein, iosnoop, iotop und ähnliche dtrace-bezogene Befehle zu verwenden.

+1

Nur beachten Sie, dass hier, was Sie tun, ist das Deaktivieren System Integrity Protection, eine Sicherheitsfunktion zur Beschränkung von Malware. Wenn Sie Dtrace nicht verwenden, sollten Sie es im Wiederherstellungsmodus mit 'csrutil enable' wieder einschalten. – rgov

33

iosnoop basiert auf dem Subsystem dtrace. von: http://jimtechstuff.blogspot.com/2015/10/dtrace-broken-under-el-capitan.html


ist DTrace unter El Capitan

Eines der Instrumente kaputt, dass ich ziemlich viel in das Debuggen verwenden ist ‚dtrace‘ und die verschiedenen Werkzeuge, die sie verwenden. z.B. Öffnen Sie Snoop, Iotop und ein paar, die ich selbst geschrieben habe.

Mit der GA von El Capitan kann jedes Dienstprogramm, das sich in einem Systemverzeichnis befindet, nicht von dtrace verfolgt werden, was ein kleines Problem darstellt. Ich wollte sehen, welches offene System die Fotos-App aufruft, und es wurde darauf hingewiesen.

Ich weiß, ich hätte einige andere Mac-Dienstprogramme (fs_usage, sc_usage usw.) verwenden können, aber ich zeige meine Solaris-Wurzeln hier und ich wollte immer noch dtrace verwenden.

Zum Glück sieht es eine Möglichkeit, die Lage zu versetzen dtrace zu sein:

Reboot the mac 
Hold ⌘R during reboot 
From the Utilities menu, run Terminal 
Enter the following command 
csrutil enable --without dtrace 

Beachten Sie, dass, wenn dabei so habe ich die folgende Warnung:

Dies ist eine nicht unterstützte Konfiguration, wahrscheinlich in der Zukunft brechen und lassen Sie Ihre Maschine in einem unbekannten Zustand.

Ich werde jetzt damit leben.


(Ich wollte richtige Antwort Ara Yeressian der einen Kommentar zu meist nur hinzufügen, aber Stackoverflow wird mich nicht mit meinem derzeitigen niedrigen Ruf lassen)