2015-01-08 11 views
36

Sto provando a profilare un'applicazione Swift in Strumenti e sto avendo difficoltà perché i simboli di debug per libswiftCore.dylib e libswiftFoundation.dylib non vengono visualizzati. Il testo del mouseover suggerisce di usare File -> Simboli per selezionare manualmente i file dSYM ma non ho idea di dove siano memorizzati, o anche se esistono. I simboli del codice che ho scritto appaiono bene.iOS - Come caricare il file dSYM per le librerie Swift come libswift.foundation.dylib?

ho creato un progetto di test e profilate in strumenti per dimostrare:

Symbols from libSwiftCore.dylib are not available

Come faccio a individuare le funzioni indicate dal libswiftCore.dylib?

+0

Hai trovato una soluzione? –

+1

No, non l'ho fatto, tutto quello che pensavo era che potevo fare una soluzione alternativa e scrivere le mie funzioni (su una sola riga) che ognuno chiamava semplicemente una funzione Swift. In questo modo ho potuto verificare quali delle mie funzioni venivano chiamate e quindi sapevo quale fosse il metodo Swift. Non è una grande soluzione però. – rankAmateur

risposta

0

È possibile trovare i file in dSym vostri archivi sotto xcode-> Finestra -> Organizzatore -> Archivio scegliere la versione corretta della vostra generazione -> Mostra nel Finder -> Mostra contenuto pacchetto => troverete un cartella "dSYMs" lì.

È possibile caricarli nell'applicazione Strumenti.

+2

Questo non è quello che viene chiesto. Non sta cercando i simboli della sua app, vuole i simboli del sistema. –

+0

Leo ha ragione. Sia rankAmateur che io stiamo cercando simboli di interni profondi e profondi delle librerie iOS. Ho tutti i simboli delle app perché sono generati automaticamente, gli stessi simboli per Core e altre librerie. Immagino che mi manchino i simboli per le librerie C usate nelle librerie iOS. –

+0

@LukaszCzerwinski Il problema è che le librerie Swift non sono librerie C interne, che in realtà hanno simboli dall'SDK. Poiché le librerie Swift sono incorporate nel pacchetto finale, forse Xcode le sta eliminando. Puoi disattivare lo stripping e vedere se questo aiuta? –

0

Se avete installato Xcode nel percorso predefinito, i file dylib veloci si possono trovare in:

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

Sotto questa directory troverete una sottodirectory per i diversi target di build, ad esempio MacOSX per OS X, iPhoneOS per dispositivi iOS e iphonesimulator per il simulatore, ecc (individuare la cartella lib guarda cosa è lì)

Il caricamento del file corretto da una di queste cartelle dovrebbe funzionare, si spera.

Se tutto questo non potrebbe essere necessario per costruire la propria copia delle librerie veloci con i simboli di debug formare il codice sorgente che si trova a https://github.com/apple/swift

0

Come io parto dal presupposto che si desidera i significati dei comandi

comando di compilazione simile a:

rapida -frontend -gnone -O -Xfrontend -disable-red-zone -Xcc -mno-red-zone -Xcc -mno-MMX -Xcc -mno-sse -Xcc -mno -sse2 -parse-as-library -import-objc-header -whole-module-optimization -module-name MyModule -emit-object -o -gnone disabilita le informazioni di debug che probabilmente non sono molto utili finché non si ha una sorta di supporto per il debugger

-O è per l'ottimizzazione, le altre opzioni sono -Onone che lo spegne ma produce una maggiore quantità di codice e -Ounchecked che è -O ma senza controlli extra dopo determinate operazioni. -O produce un buon codice ma tende a incorporare tutto in un'unica grande funzione che può rendere difficile l'allenamento cosa è andato storto quando un gestore di eccezioni fornisce semplicemente il puntatore dell'istruzione come origine di un errore.

-Xfrontend -disable-red-zone garantisce che il codice generato da swiftc non generi codice di zona rossa.

-Xcc -mno-red-zone indica al compilatore clang di non utilizzare la zona rossa su tutti i file che compila.clang è usato se c'è un codice nel file di intestazione che usi, probabilmente sarà il caso come verrà mostrato.

-Xcc -mno-MMX -Xcc -mno-SSE -Xcc -mno-SSE2 utilizza le opzioni clang per dire swiftc di non usare MMX/SSE/SSE2

-parse-as-biblioteca significa che il codice non è una sceneggiatura.

-import-objc-header consente di importare un file di intestazione .h che consente l'accesso alla funzione C e alle definizioni di tipo.

-module-name è richiesto anche se è utilizzato solo in qualifica completa dei nomi dei metodi e delle funzioni. Tuttavia i file di modulo reali non vengono creati con questa opzione.

Biblioteche

Ora che un file ELF .o è stato prodotto ha bisogno di essere collegato a un eseguibile finale. Swift richiede che il suo stdlib sia collegato in quanto fornisce alcune funzioni di base che sono necessarie a Swift in fase di runtime.

Il nome della libreria è libswiftCore.a e dovrebbe essere in lib/swift_static/linux nella directory di installazione.

libswiftCore.a si basa su libc, libcpp e su alcune altre librerie di sistema, tuttavia non sono disponibili, pertanto è necessario emulare le funzioni mancanti. L'elenco completo dei simboli che devono essere attuate può essere trovato qui: - https://github.com/spevans/swift-project1/blob/master/doc/symbols.txt

0

Questa risposta è copiato da https://github.com/Flash3001/iOSCharts.Xamarin/issues/17

da: Flash3001

, ma spero che questo vi aiuterà a:

Il file si trova in: /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS

Prima:

<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)"> 

Dopo:

<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"> 

Attenzione: non copiare l'intero file, come si romperà le altre cose. Avviso 2: Normalmente non si dovrebbe modificare questo file, poiché è Xamarin e può interrompere il processo di compilazione se si fa la cosa sbagliata. Avviso 3: verrà sostituito quando si aggiorna Xamarin.

Problemi correlati