Distribuire, eseguire ed eseguire il debug del progetto MSBuild Linux

Il supporto Linux è disponibile in Visual Studio 2017 e versioni successive. Per visualizzare la documentazione per queste versioni, impostare l'elenco a discesa Versione che si trova sopra il sommario su Visual Studio 2017 o Visual Studio 2019.

Dopo aver creato un progetto Linux C++ basato su MSBuild in Visual Studio ed è stato connesso al progetto usando il Gestione connessioni Linux, è possibile eseguire ed eseguire il debug del progetto. Si compila, si esegue e si sottopone a debug il codice nella destinazione remota.

Visual Studio 2019 versione 16.1 e versioni successive: è possibile usare sistemi Linux diversi per il debug e la compilazione. È ad esempio possibile eseguire la compilazione su un sistema x64 e distribuire in un dispositivo ARM quando si usano scenari IoT come destinazione. Per altre informazioni, vedere Specificare computer diversi per la compilazione e il debug più avanti in questo articolo.

Esistono diversi modi di interagire con il progetto Linux ed eseguirne il debug.

  • Eseguire il debug usando le tradizionali funzionalità di Visual Studio, ad esempio punti di interruzione, finestre Espressioni di controllo e passaggio del puntatore su una variabile. Usando questi metodi, è possibile eseguire il debug nel modo consueto, come per gli altri tipi di progetto.

  • Visualizzare l'output dal computer di destinazione nella finestra della console di Linux. È anche possibile usare la console per inviare l'input al computer di destinazione.

Eseguire il debug del progetto Linux

  1. Selezionare la modalità di debug nella pagina delle proprietà Debug.

    Per il debug delle applicazioni in esecuzione su Linux viene usato GDB. Quando si esegue il debug in un sistema remoto (non WSL), è possibile eseguire GDB in due modi diversi selezionabili dall'opzione Modalità di debug nella pagina delle proprietà Debug del progetto:

    Screenshot della finestra di dialogo Pagine delle proprietà della console Linux di Visual Studio con debug delle proprietà > di configurazione selezionata e modalità debug evidenziata con G D B selezionata e evidenziata dall'elenco a discesa.

    Per il debug delle applicazioni in esecuzione su Linux viene usato GDB. È possibile eseguire GDB in due modalità diverse, selezionabili dall'opzione Modalità di debug nella pagina delle proprietà di debug del progetto:

    Screenshot della finestra di dialogo Pagine delle proprietà della console Linux di Visual Studio 2017 con debug delle proprietà > di configurazione selezionata e modalità debug evidenziata con G D B selezionata e evidenziata dall'elenco a discesa.

    • In modalità gdbserver, GDB viene eseguito in locale e si connette a gdbserver nel sistema remoto.

    • In modalità gdb, GDB viene guidato nel sistema remoto dal debugger di Visual Studio. Questa è un'opzione migliore se la versione locale di GDB non è compatibile con la versione installata nel computer di destinazione. Si tratta dell'unica modalità supportata dalla finestra della console Linux.

    Nota

    Se non è possibile raggiungere i punti di interruzione in modalità di debug gdbserver, provare la modalità gdb. gdb deve prima essere installato nella destinazione remota.

  2. Selezionare la destinazione remota usando la barra degli strumenti standard Debug in Visual Studio.

    Quando la destinazione remota è disponibile, verrà visualizzata in base al nome o all'indirizzo IP.

    Screenshot che mostra un indirizzo IP di destinazione remota.

    Se non è ancora stata eseguita la connessione alla destinazione remota, verrà visualizzato un'istruzione per usare l'Gestione connessioni Linux per connettersi alla destinazione remota.

    Screenshot che mostra l'architettura remota, ovvero x64.

  3. Impostare un punto di interruzione facendo clic nella barra di navigazione a sinistra di un codice che verrà sicuramente eseguito.

    Un punto rosso viene visualizzato nella riga di codice in cui è stato impostato il punto di interruzione.

  4. Premere F5 (o Debug > Avvia debug) per avviare il debug.

    Quando si avvia il debug, l'applicazione viene compilata nella destinazione remota prima che venga avviata. Gli eventuali errori di compilazione verranno visualizzati nella finestra Elenco errori.

    Se non sono presenti errori, l'app verrà avviata e il debugger verrà sospeso in corrispondenza del punto di interruzione.

    Screenshot che mostra l'app ha raggiunto un punto di interruzione.

    È ora possibile interagire con l'applicazione nello stato corrente, visualizzare le variabili ed eseguire il codice un'istruzione alla volta premendo i tasti di comando, ad esempio F10 o F11.

  5. Se si vuole usare la console Linux per interagire con l'app, selezionare Debug > console Linux.

    Screenshot che mostra la voce di menu della console Linux.

    Questa console visualizzerà qualsiasi output della console dal computer di destinazione e lo invierà al computer di destinazione.

    Screenshot che mostra la finestra Console Linux.

Configurare altre opzioni di debug (progetti MSBuild)

  • Gli argomenti della riga di comando possono essere passati all'eseguibile usando l'elemento Argomenti del programma nella pagina delle proprietà di debug del progetto.

  • È possibile esportare la variabile di ambiente usando il DISPLAYcomando pre-avvio nelle pagine delle proprietà Debug del progetto. ad esempio export DISPLAY=:0.0

    Screenshot che mostra la proprietà Program Arguments nella finestra di dialogo Pagine proprietà.

  • Le opzioni specifiche del debugger possono essere passate a GDB usando la voce Comandi aggiuntivi del debugger. Può essere utile ad esempio ignorare i segnali SIGILL (istruzione non valida). Per ottenere questo risultato, è possibile usare il comando handle, aggiungendo quanto segue alla voce Comandi aggiuntivi del debugger come illustrato in precedenza:

    handle SIGILL nostop noprint

  • È possibile specificare il percorso del GDB usato da Visual Studio usando l'elemento Percorso GDB nella pagina delle proprietà Debug del progetto. Questa proprietà è disponibile in Visual Studio 2019 versione 16.9 e successiva.

Debug con Associa a processo

La pagina delle proprietà Debug per i progetti di Visual Studio e le impostazioni Launch.vs.json per progetti CMake offrono impostazioni che consentono di creare un'associazione a un processo in esecuzione. Se è necessario un maggiore controllo oltre a ciò che viene fornito in queste impostazioni, è possibile inserire un file denominato Microsoft.MIEngine.Options.xml nella radice della soluzione o dell'area di lavoro. Di seguito è riportato un semplice esempio:

<?xml version="1.0" encoding="utf-8"?>
<SupplementalLaunchOptions>
    <AttachOptions>
      <AttachOptionsForConnection AdditionalSOLibSearchPath="/home/user/solibs">
        <ServerOptions MIDebuggerPath="C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\Common7\IDE\VC\Linux\bin\gdb\7.9\x86_64-linux-gnu-gdb.exe"
ExePath="C:\temp\ConsoleApplication17\ConsoleApplication17\bin\x64\Debug\ConsoleApplication17.out"/>
        <SetupCommands>
          <Command IgnoreFailures="true">-enable-pretty-printing</Command>
        </SetupCommands>
      </AttachOptionsForConnection>
    </AttachOptions>
</SupplementalLaunchOptions>

L'elemento AttachOptionsForConnection include la maggior parte degli attributi che potrebbero essere necessari. Nell'esempio precedente viene illustrato come specificare una posizione per cercare più librerie .so. L'elemento figlio ServerOptions consente di creare un'associazione al processo remoto usando invece la modalità gdbserver. A tale scopo, è necessario specificare un client gdb locale (quello fornito in Visual Studio 2017 è illustrato sopra) e una copia locale del file binario con simboli. L'elemento SetupCommands consente di passare i comandi direttamente a gdb. È possibile trovare tutte le opzioni disponibili nello schema LaunchOptions.xsd su GitHub.

Specificare computer diversi per la compilazione e il debug nei progetti Linux basati su MSBuild

È possibile separare il computer di compilazione remoto dal computer di debug remoto per i progetti Linux basati su MSBuild e i progetti CMake destinati a un computer Linux remoto. Ad esempio, è ora possibile eseguire la compilazione su un sistema x64 e distribuire in un dispositivo ARM, quando si usano scenari IoT come destinazione.

Per impostazione predefinita, il computer di debug remoto è lo stesso del computer di compilazione remoto (Proprietà di configurazione>computer dicompilazioneremota).> Per specificare un nuovo computer di debug remoto, fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e passare a Proprietà di configurazione>Debug>Computer di debug remoto.

Screenshot che mostra la proprietà del computer di debug remoto Linux nella finestra di dialogo Pagine proprietà che mostra il nome utente, il tipo di autenticazione e la porta.

Il menu a discesa per Computer di debug remoto è popolato con tutte le connessioni remote stabilite. Per aggiungere una nuova connessione remota, passare aOpzioni>strumenti>multipiattaforma>Gestione connessioni o cercare "Gestione connessioni" in Avvio rapido. È anche possibile specificare una nuova directory di distribuzione remota nelle pagine delle proprietà > del progetto (proprietà di configurazionegenerale>distribuzione remota).

Per impostazione predefinita, nel computer di debug remoto vengono distribuiti solo i file necessari per il debug del processo. È possibile usare Esplora soluzioni per configurare i file di origine da distribuire nel computer di debug remoto. Quando si fa clic su un file di origine, verrà visualizzata un'anteprima delle relative proprietà file direttamente sotto la Esplora soluzioni.

Screenshot che mostra le proprietà del file main.cpp con il contenuto della proprietà = False evidenziato.

La proprietà Content specifica se il file verrà distribuito nel computer di debug remoto. È possibile disabilitare completamente la distribuzione passando a Pagine> delle proprietà Configuration Manager e deselezionando Distribuisci per la configurazione desiderata.

In alcuni casi, potrebbe essere necessario maggiore controllo sulla distribuzione del progetto. Ad esempio, alcuni file da distribuire potrebbero essere esterni alla soluzione oppure personalizzare la directory di distribuzione remota per file o directory. In questi casi, aggiungere uno o più blocchi di codice seguenti al file con estensione vcxproj e sostituire "example.cpp" con i nomi dei file:


<ItemGroup>
   <RemoteDeploy Include="__example.cpp">
<!-- This is the source Linux machine, can be empty if DeploymentType is LocalRemote -->
      <SourceMachine>$(RemoteTarget)</SourceMachine>
      <TargetMachine>$(RemoteDebuggingTarget)</TargetMachine>
      <SourcePath>~/example.cpp</SourcePath>
      <TargetPath>~/example.cpp</TargetPath>
<!-- DeploymentType can be LocalRemote, in which case SourceMachine will be empty and SourcePath is a local file on Windows -->
      <DeploymentType>RemoteRemote</DeploymentType>
<!-- Indicates whether the deployment contains executables -->
      <Executable>true</Executable>
   </RemoteDeploy>
</ItemGroup>

Progetti CMake

Per i progetti CMake destinati a un computer Linux remoto, è possibile specificare un nuovo computer di debug remoto in launch.vs.json. Per impostazione predefinita, il valore di "remoteMachineName" viene sincronizzato con la proprietà "remoteMachineName" in CMakeSettings.json, che corrisponde al computer di compilazione remota. Queste proprietà non devono più corrispondere e il valore di "remoteMachineName" in launch.vs.json determineranno quale computer remoto viene usato per la distribuzione e il debug.

Il computer di debug remoto CMake specificato nel file launch_schema.json. Il nome del computer remoto è ${debugInfo . remoteMachineName}

IntelliSense suggerisce un elenco di tutte le connessioni remote stabilite. È possibile aggiungere una nuova connessione remota passando aOpzioni>strumenti>multipiattaforma>Gestione connessioni o cercando "Gestione connessioni" in Avvio rapido.

Se si vuole un controllo completo sulla distribuzione, è possibile aggiungere uno o più blocchi di codice seguenti al file launch.vs.json. Ricordarsi di sostituire i valori dei segnaposto con i valori reali:

"disableDeploy": false,
"deployDirectory": "~\foo",
"deploy" : [
   {
      "sourceMachine": "127.0.0.1 (username=example1, port=22, authentication=Password)",
      "targetMachine": "192.0.0.1 (username=example2, port=22, authentication=Password)",
      "sourcePath": "~/example.cpp",
      "targetPath": "~/example.cpp",
      "executable": "false"
   }
]

Passaggi successivi

Vedi anche

Proprietà di debug C++ (Linux C++)