2015-01-08 3 views
36

Ich versuche eine Swift-Anwendung in Instruments zu profilieren und habe Schwierigkeiten, weil Debug-Symbole für libswiftCore.dylib und libswiftFoundation.dylib-Bibliotheken nicht angezeigt werden. Der Mouseover-Text schlägt vor, über Datei -> Symbole manuell die dSYM-Dateien auszuwählen, aber ich habe keine Ahnung, wo sie gespeichert sind oder ob sie existieren. Symbole aus Code, die ich geschrieben habe, erscheinen gut.iOS Instruments - Wie dSYM-Datei für Swift-Bibliotheken wie libswift.foundation.dylib laden?

stelle ich ein Testprojekt und profilierte sie in Instrumente demonstrieren:

Symbols from libSwiftCore.dylib are not available

Wie kann ich die von libswiftCore.dylib gezeigten Funktionen zu identifizieren?

+0

Haben Sie eine Lösung gefunden? –

+1

Nein, ich dachte nicht daran, dass ich einen Workaround machen und meine eigenen (einzeiligen) Funktionen schreiben könnte, die jeweils nur eine Swift-Funktion genannt haben. Auf diese Weise konnte ich überprüfen, welche meiner Funktionen aufgerufen wurde und dann wusste ich, welche Swift-Methode welche war. Es ist jedoch keine großartige Lösung. – rankAmateur

Antwort

0

Sie können die DSYM Dateien in Ihren Archiven unter xcode- finden> Window -> Organizer -> Archiv die richtige Version des Builds wählen -> Im Finder anzeigen -> Paketinhalt zeigen => Sie finden eine "dSYMs" -Ordner dort.

Sie können sie in die Anwendung Instrumente laden.

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/:

+2

Das ist nicht gefragt. Er sucht nicht nach Symbolen seiner App, er möchte die System-Symbole. –

+0

Leo hat Recht. Sowohl rankAmateur als auch ich suchen nach Symbolen für tiefgründige Interna von iOS Bibliotheken. Ich habe alle App-Symbole, da sie automatisch generiert werden, die gleichen Symbole für Core und andere Bibliotheken. Ich denke, ich vermisse Symbole für C-Bibliotheken, die in iOS-Bibliotheken verwendet werden. –

+0

@LukaszCzerwinski Das Problem ist, die Swift-Bibliotheken sind keine internen C-Bibliotheken, die tatsächlich Symbole aus dem SDK haben. Da die Swift-Bibliotheken in das endgültige Paket eingebettet sind, streift Xcode sie möglicherweise ab. Können Sie das Strippen deaktivieren und sehen, ob das hilft? –

0

Wenn Sie Xcode im Standardverzeichnis installiert haben, die schnellen dylib Dateien finden Sie in

Unter diesem Verzeichnis ein Unterverzeichnis für die verschiedene Build-Ziele zu finden, zum Beispiel macosx für OS X, iphoneos für iOS-Geräte und iphonesimulator für den Simulator usw. (navigieren Sie zum Ordner lib sehen was ist da)

Das Laden der richtigen Datei aus einem dieser Ordner sollte hoffentlich funktionieren.

Wenn alles andere fehlschlägt müssen Sie Ihre eigene Kopie der schnellen Bibliotheken mit Debug-Symbole bilden den Quellcode bauen, die auf https://github.com/apple/swift

0

gefunden werden kann, wie ich bin vorausgesetzt, Sie wollen die Bedeutung von Befehlen

Der Befehl zum Kompilieren sieht ungefähr so ​​aus:

swift -frontend -gnone -O -Xfrontend -disable-rote-Zone -Xcc -mno-rote-Zone -Xcc -mno-mmx -Xcc -mno-sse -Xcc -mno -sse2 -parse-as-library -import-objc-header -whole-modul-optimierung -modulname MyModule -emit-object -o -gnone deaktiviert Debug-Informationen, die wahrscheinlich nicht sehr nützlich sind, bis Sie irgendeine Art von Debugger-Unterstützung haben

-O ist für die Optimierung, die anderen Optionen sind -Onone, die es ausschaltet, sondern produziert eine größere Menge an Code und -Ounched was ist -O aber ohne zusätzliche Prüfungen nach bestimmten Operationen. -O erzeugt einen guten Code, neigt aber dazu, alles in eine große Funktion einzubinden, was es schwierig machen kann zu trainieren, was schief gelaufen ist, wenn ein Ausnahmebehandler einfach den Befehlszeiger als Quelle eines Fehlers angibt.

-Xfrontend -disable-red-zone stellt sicher, dass vom swiftc erzeugter Code keinen roten Zonencode generiert.

-Xcc -mno-red-zone weist den clang-Compiler an, die rote Zone für die kompilierten Dateien nicht zu verwenden.clang wird verwendet, wenn in der von Ihnen verwendeten Header-Datei ein Code vorhanden ist, der wahrscheinlich der Fall sein wird, wie gezeigt wird.

-Xcc -mno-MMX -Xcc -mno-sse -Xcc -mno-sse2 verwendet Optionen Klirren swiftc zu sagen, nicht MMX/SSE/SSE2

-parse-as-Bibliothek zu verwenden, bedeutet, dass der Code ist kein Skript.

-import-objc-Header ermöglicht eine .h Header-Datei importiert werden, die den Zugriff auf Definitionen C-Funktion und Art ermöglicht.

-Modul-Name erforderlich ist, wenn auch nur in voll qualifizierenden die Methode und Funktionsnamen verwendet wird. Mit dieser Option werden jedoch keine tatsächlichen Moduldateien erstellt.

Bibliotheken

Nun, da eine .o ELF-Datei muss produziert wurde es auf eine endgültige ausführbare Datei verknüpft werden. Swift erfordert, dass seine stdlib verknüpft ist, da dies einige grundlegende Funktionen bereitstellt, die Swift zur Laufzeit benötigt.

Der Bibliotheksname ist libswiftCore.a und in lib/swift_static/Linux unter dem Installationsverzeichnis sein sollte.

libswiftCore.a setzt auf libc, libcpp und ein paar andere Systembibliotheken aber sie verfügbar sein werde nicht so die fehlenden Funktionen emuliert werden müssen. Die vollständige Liste der Symbole, die hier können umgesetzt werden müssen gefunden: - https://github.com/spevans/swift-project1/blob/master/doc/symbols.txt

0

Diese Antwort von https://github.com/Flash3001/iOSCharts.Xamarin/issues/17

von kopiert wird: Flash3001

aber hoffen, das wird Ihnen helfen:

Die Datei befindet sich in: /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS

Vorher:

<Target Name="_CalculateCodesignAppBundleInputs" Condition="'$(_RequireCodeSigning)' == 'true'"> 
     <ItemGroup> 
      <_CodesignAppBundleInput Include="$(_NativeExecutable)" /> 
      <_CodesignAppBundleInput Include="$(_AppBundlePath)Info.plist" /> 
      <_CodesignAppBundleInput Include="$(_AppBundlePath)embedded.mobileprovision" /> 
      <_CodesignAppBundleInput Include="$(DeviceSpecificIntermediateOutputPath)Entitlements.xcent" /> 
      <_CodesignAppBundleInput Include="@(_BundleResourceWithLogicalName)" /> 
      <_CodesignAppBundleInput Include="@(_NativeLibrary)" /> 
      <_CodesignAppBundleInput Include="@(_Frameworks)" /> 
      <_CodesignAppBundleInput Include="@(_ResolvedAppExtensionReferences -> '$(_AppBundlePath)PlugIns\%(FileName)%(Extension)\_CodeSignature\CodeResources')" Condition="'$(IsAppExtension)' == 'false'" /> 

      <!-- Include WatchOS1 App references --> 
      <_CodesignAppBundleInput Include="@(_ResolvedWatchAppReferences -> '$(_AppBundlePath)%(FileName)%(Extension)\_CodeSignature\CodeResources')" Condition="'$(IsAppExtension)' == 'true'" /> 

      <!-- Include WatchOS2 App references --> 
      <_CodesignAppBundleInput Include="@(_ResolvedWatchAppReferences -> '$(_AppBundlePath)Watch\%(FileName)%(Extension)\_CodeSignature\CodeResources')" Condition="'$(OutputType)' == 'Exe'" /> 
     </ItemGroup> 
    </Target> 

    <Target Name="_CodesignAppBundle" Condition="'$(_RequireCodeSigning)' == 'true'" DependsOnTargets="$(_CodesignAppBundleDependsOn)" 
     Inputs="@(_CodesignAppBundleInput)" 
     Outputs="$(DeviceSpecificIntermediateOutputPath)codesign\$(_AppBundleName)$(AppBundleExtension)"> 

Nach:

<Target Name="_CalculateCodesignAppBundleInputs" Condition="'$(_RequireCodeSigning)' == 'true'"> 
     <ItemGroup> 
      <_CodesignAppBundleInputs Include="$(_AppBundlePath)**\*.*" Exclude="$(_AppBundlePath)_CodeSignature\CodeResources" /> 
     </ItemGroup> 
    </Target> 

    <Target Name="_CodesignAppBundle" Condition="'$(_RequireCodeSigning)' == 'true'" DependsOnTargets="$(_CodesignAppBundleDependsOn)" 
     Inputs="@(_CodesignAppBundleInputs)" Outputs="$(_AppBundlePath)_CodeSignature\CodeResources"> 

Warnung: die gesamte Datei nicht kopieren, wie es andere Dinge brechen. Warnung 2: Normalerweise sollten Sie diese Datei nicht ändern, da es Xamarins ist und den Build-Prozess daran hindern kann zu arbeiten, wenn Sie das Falsche tun. Warnung 3: Es wird ersetzt, wenn Sie Xamarin aktualisieren.

Verwandte Themen