Wie drucke ich eine CFStringRef in einer DTrace-Aktion?

8

Ich habe eine DTrace-Sonde, die Aufrufe an eine Funktion abfängt, und eines der Argumente der Funktion ist CFStringRef . Dies ist eine private Struktur, die einen Zeiger auf eine Unicode-Zeichenfolge enthält. Aber das CFStringRef ist nicht selbst ein char* , so dass normale DTrace Methoden wie copyinstr() nur ?cp? zurückgeben, was nicht gerade hilfreich ist.

Wie kann ich die Zeichenfolge in der DTrace-Aktion ausdrucken?

    
TALlama 11.09.2009, 22:46
quelle

2 Antworten

12

Soweit ich weiß, gibt es keine integrierte Unterstützung für diese Art von Dingen. Normalerweise würde eine Bibliothek eine Sonde veröffentlichen, die die Zeichenfolge für Sie dekodiert (wie Brad erwähnt). Da Sie in Ihrem Fall die Bibliothek nicht ändern können, müssen Sie den pid -Provider verwenden und in eine Benutzerfunktion einhaken und sie selbst dekodieren.

Die Lösung (die der Vorgehensweise sehr ähnlich ist, die Sie in C ++ verwenden würden, um std::string auszugeben) besteht darin, den Zeiger, der an einem 2-Wort-Offset vom Basiszeiger CFStringRef gespeichert ist, auszugeben. Beachten Sie, dass, da ein CFString Zeichenketten intern in einer Vielzahl von Formaten und Darstellungen speichern kann, dies Änderungen unterliegen kann.

Gegeben die triviale Testanwendung:

%Vor%

Das folgende Skript dtrace gibt den Zeichenfolgenwert des ersten Arguments aus, wobei angenommen wird, dass es sich um ein CFStringRef :

handelt %Vor%

Und die Ausgabe wird etwa so aussehen:

%Vor%

Entfernen Sie einfach die richtige typedef , je nachdem, ob Sie mit einer 32-Bit- oder 64-Bit-Binärdatei arbeiten. Ich habe dies gegen beide Architekturen am 10.6 getestet und es funktioniert gut.

    
gavinb 22.09.2009, 04:31
quelle
1

Ich glaube, dass Sie dies nicht direkt tun können, aber Sie können eine benutzerdefinierte statische Sonde erstellen, die den CFString / NSString als Char * eingibt, das Sie mit copyinstr () verwenden können. Ich beschreibe, wie man dies in einem Artikel hier tut .

    
Brad Larson 12.09.2009 01:30
quelle

Tags und Links