Distribuire, eseguire ed eseguire il debug del progetto MSBuild Linux

Il supporto per 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 C++ linux basato su MSBuild in Visual Studio e aver eseguito la connessione 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 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à dell'app console Linux di Visual Studio con Proprietà > di configurazione Debug 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à dell'app console Linux di Visual Studio 2017 con Proprietà > di configurazione Debug 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. Questa è l'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 si è ancora connessi alla destinazione remota, verrà visualizzata un'istruzione per usare Linux Gestione connessioni 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 che 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 della 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 DISPLAY variabile di ambiente usando il comando di preavvio 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 delle 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 successive.

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 quanto specificato in tali 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 un percorso in cui cercare altre 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 sia per i progetti Linux basati su MSBuild che per 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 corrisponde al computer di compilazione remota (Proprietà di configurazione>Generale>Computer di compilazione remota). 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à computer di debug remoto Linux nella finestra di dialogo Pagine delle 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 a Strumenti>Opzioni>Multipiattaforma>Gestione connessioni o cercare "Gestione connessioni" in Avvio veloce. È anche possibile specificare una nuova directory di distribuzione remota nelle pagine delle proprietà del progetto (proprietà>di configurazione Directory distribuzione remota generale).>

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, viene visualizzata un'anteprima delle relative proprietà file direttamente sotto il 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 la distribuzione completamente passando a Pagine delle proprietà>Gestione configurazione e deselezionando Distribuisci per la specifica configurazione.

In alcuni casi, potrebbe essere necessario un maggiore controllo sulla distribuzione del progetto. Ad esempio, alcuni file da distribuire potrebbero essere esterni alla soluzione oppure si vuole 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.

Computer di debug remoto CMake specificato nel file di 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 a Strumenti>Opzioni>Multipiattaforma>Gestione connessioni o cercando "Gestione connessioni" in Avvio veloce.

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