Déboguer localement des fonctions PowerShell Azure
Azure Functions vous permet de développer vos fonctions en tant que scripts PowerShell.
Vous pouvez déboguer localement vos fonctions PowerShell comme vous le feriez pour tout script PowerShell, à l’aide des outils de développement standard suivants :
- Visual Studio Code : Éditeur de texte gratuit, léger et open source de Microsoft avec l’extension PowerShell qui offre une expérience de développement PowerShell complète.
- Console PowerShell : Déboguez en utilisant les mêmes commandes que vous utiliseriez pour déboguer tout autre processus PowerShell.
Azure Functions Core Tools prend en charge le débogage local d’Azure Functions, dont les fonctions PowerShell.
Exemple d’application de fonction
L’application de fonction utilisée dans cet article possède une seule fonction déclenchée via HTTP et possède les fichiers suivants :
PSFunctionApp
| - HttpTriggerFunction
| | - run.ps1
| | - function.json
| - local.settings.json
| - host.json
| - profile.ps1
Cette application de fonction est semblable à celle que vous obtenez lorsque vous effectuez les procédures de démarrage rapide PowerShell.
Le code de fonction dans run.ps1
ressemble au script suivant :
param($Request)
$name = $Request.Query.Name
if($name) {
$status = 200
$body = "Hello $name"
}
else {
$status = 400
$body = "Please pass a name on the query string or in the request body."
}
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
StatusCode = $status
Body = $body
})
Définir le point d’attache
Pour déboguer une fonction PowerShell quelconque, la fonction doit s’arrêter pour que le débogueur soit attaché. L’applet de commande Wait-Debugger
arrête son exécution et attend le débogueur.
Notes
Lorsque vous utilisez PowerShell 7, vous n’avez pas besoin d’ajouter l’appel Wait-Debugger
à votre code.
Il vous suffit d’ajouter un appel à l’applet de commande Wait-Debugger
juste au-dessus de l’instruction if
, comme suit :
param($Request)
$name = $Request.Query.Name
# This is where we will wait for the debugger to attach
Wait-Debugger
if($name) {
$status = 200
$body = "Hello $name"
}
# ...
Le débogage commence à l’instruction if
.
Avec Wait-Debugger
en place, vous pouvez maintenant déboguer les fonctions à l’aide de Visual Studio Code ou d’une console PowerShell.
Déboguer dans Visual Studio Code
Pour déboguer vos fonctions PowerShell dans Visual Studio Code, les éléments suivants doivent être installés :
- Extension PowerShell pour Visual Studio Code
- Extension Azure Functions pour Visual Studio Code
- PowerShell Core 6.2 ou version ultérieure
Après avoir installé ces dépendances, chargez un projet de fonctions PowerShell existant ou créez votre premier projet de fonctions PowerShell.
Notes
Si votre projet n’a pas les fichiers de configuration nécessaires, vous êtes invité à les ajouter.
Définir la version de PowerShell
PowerShell Core s’installe côte à côte avec Windows PowerShell. Définissez PowerShell Core en tant que version de PowerShell à utiliser avec l’extension PowerShell pour Visual Studio Code.
Appuyez sur F1 pour afficher la palette de commandes, puis recherchez
Session
.Choisissez PowerShell : Afficher le menu de session.
Si votre session active n’est pas PowerShell Core 6, choisissez Basculer vers : PowerShell Core 6.
Lorsqu’un fichier PowerShell est ouvert, vous voyez la version affichée en vert en bas à droite de la fenêtre. La sélection de ce texte affiche également le menu de la session. Pour plus d’informations, consultez Choisir la version de PowerShell à utiliser avec l’extension.
Démarrer l’application de fonction
Vérifiez que Wait-Debugger
est défini dans la fonction où vous souhaitez attacher le débogueur. Avec Wait-Debugger
ajouté, vous pouvez déboguer votre application de fonction à l’aide de Visual Studio Code.
Choisissez le volet Déboguer, puis Attacher à la fonction PowerShell.
Vous pouvez également appuyer sur la touche F5 pour démarrer le débogage.
L’opération Démarrer le débogage effectue les tâches suivantes :
- Exécute
func extensions install
dans le terminal pour installer les extensions Azure Functions requises par votre application de fonction. - Exécute
func host start
dans le terminal pour démarrer l’application de fonction dans l’hôte Functions. - Attache le débogueur PowerShell à l’instance d’exécution de PowerShell dans le runtime Functions.
Notes
Vous devez vous assurer que PSWorkerInProcConcurrencyUpperBound a la valeur 1 pour garantir une expérience de débogage correcte dans Visual Studio Code. Il s’agit de la valeur par défaut.
Lorsque votre application de fonction est en cours d’exécution, vous avez besoin d’une console PowerShell distincte pour appeler la fonction déclenchée via HTTP.
Dans ce cas, la console PowerShell est le client. Invoke-RestMethod
permet de déclencher la fonction.
Dans une console PowerShell, exécutez la commande suivante :
Invoke-RestMethod "http://localhost:7071/api/HttpTrigger?Name=Functions"
Vous remarquerez qu’une réponse n’est pas immédiatement retournée. Cela est dû au fait que Wait-Debugger
a attaché le débogueur et que l’exécution PowerShell est passée en mode Arrêt dès qu’elle a pu. Cela est dû au concept BreakAll, qui est expliqué plus loin. Une fois que vous appuyez sur le bouton continue
, le débogueur s’arrête désormais sur la ligne située juste après Wait-Debugger
.
À ce stade, le débogueur est attaché et vous pouvez effectuer toutes les opérations normales de débogage. Pour plus d’informations sur l’utilisation du débogueur dans Visual Studio Code, consultez la documentation officielle.
Lorsque vous continuez et appelez entièrement votre script, vous remarquez que :
- La console PowerShell qui a exécuté
Invoke-RestMethod
a retourné un résultat - La console intégrée PowerShell dans Visual Studio Code est en attente d’un script à exécuter
Plus tard, lorsque vous appelez la même fonction, le débogueur dans l’extension PowerShell s’arrête juste après Wait-Debugger
.
Débogage dans une console PowerShell
Notes
Cette section suppose que vous avez lu les documents d’Azure Functions Core Tools et que vous savez comment utiliser la commande func host start
pour démarrer votre application de fonction.
Ouvrez une console, accédez via cd
dans le répertoire de votre application de fonction, puis exécutez la commande suivante :
func host start
Avec l’application de fonction en cours d’exécution et Wait-Debugger
en place, vous pouvez attacher au processus. Vous avez besoin de deux consoles PowerShell supplémentaires.
L’une de ces consoles agit comme client. À partir de cela, vous appelez Invoke-RestMethod
pour déclencher la fonction. Par exemple, vous pouvez exécuter la commande suivante :
Invoke-RestMethod "http://localhost:7071/api/HttpTrigger?Name=Functions"
Vous remarquerez qu’elle ne retourne pas de réponse, ce qui est le résultat de Wait-Debugger
. L’instance d’exécution PowerShell attend maintenant un débogueur à attacher. Nous allons l’attacher.
Dans l’autre console PowerShell, exécutez la commande suivante :
Get-PSHostProcessInfo
Cette applet de commande retourne une table qui ressemble à la sortie suivante :
ProcessName ProcessId AppDomainName
----------- --------- -------------
dotnet 49988 None
pwsh 43796 None
pwsh 49970 None
pwsh 3533 None
pwsh 79544 None
pwsh 34881 None
pwsh 32071 None
pwsh 88785 None
Notez le ProcessId
de l’élément dans la table avec ProcessName
comme dotnet
. Ce processus est votre application de fonction.
Ensuite, exécutez l'extrait de code suivant :
# This enters into the Azure Functions PowerShell process.
# Put your value of `ProcessId` here.
Enter-PSHostProcess -Id $ProcessId
# This triggers the debugger.
Debug-Runspace 1
Une fois démarré, le débogueur s’arrête et affiche quelque chose de similaire à la sortie suivante :
Debugging Runspace: Runspace1
To end the debugging session type the 'Detach' command at the debugger prompt, or type 'Ctrl+C' otherwise.
At /Path/To/PSFunctionApp/HttpTriggerFunction/run.ps1:13 char:1
+ if($name) { ...
+ ~~~~~~~~~~~
[DBG]: [Process:49988]: [Runspace1]: PS /Path/To/PSFunctionApp>>
À ce stade, vous êtes arrêté à un point d’arrêt dans le débogueur PowerShell. À partir de là, vous pouvez effectuer toutes les opérations de débogage habituelles, un pas à pas principal, un pas à pas détaillé, continuer, quitter, etc. Pour afficher l’ensemble complet des commandes de débogage disponibles dans la console, exécutez la commande h
ou ?
.
Vous pouvez également définir des points d’arrêt à ce niveau avec l’applet de commande Set-PSBreakpoint
.
Lorsque vous continuez et appelez entièrement votre script, vous remarquez que :
- La console PowerShell où vous avez exécuté
Invoke-RestMethod
a maintenant retourné un résultat. - La console PowerShell où vous avez exécuté
Debug-Runspace
est en attente d’un script à exécuter.
Vous pouvez appeler à nouveau la même fonction (à l’aide de Invoke-RestMethod
par exemple) et le débogueur s’arrête juste après la commande Wait-Debugger
.
Considérations relatives au débogage
Gardez à l’esprit les problèmes suivants lors du débogage de votre code Functions.
BreakAll
peut entraîner l’arrêt de votre débogueur dans un emplacement inattendu
L’extension PowerShell utilise Debug-Runspace
, qui à son tour dépend de la fonctionnalité BreakAll
de PowerShell. Cette fonctionnalité indique à PowerShell de s’arrêter à la première commande qui est exécutée. Ce comportement vous donne la possibilité de définir des points d’arrêt au sein de l’instance d’exécution déboguée.
Le runtime Azure Functions exécute quelques commandes avant d’appeler véritablement votre script run.ps1
. Il est donc possible que le débogueur finisse par s’arrêter au sein de Microsoft.Azure.Functions.PowerShellWorker.psm1
ou de Microsoft.Azure.Functions.PowerShellWorker.psd1
.
Si cet arrêt doit se produire, exécutez la commande continue
ou c
pour ignorer ce point d’arrêt. Vous vous arrêtez ensuite au point d’arrêt attendu.
Dépannage
Si vous rencontrez des difficultés pendant le débogage, vous devez vérifier les éléments suivants :
Vérification | Action |
---|---|
Exécutez func --version à partir du terminal. Si vous recevez une erreur indiquant que func est introuvable, il se peut que Core Tools (func.exe) soit absent de la variable path locale. |
Réinstallez Core Tools. |
Dans Visual Studio Code, le terminal par défaut doit avoir accès à func.exe. Vérifiez que vous n’utilisez pas un terminal par défaut sur lequel Core Tools n’est pas installé, tel que le sous-système Windows pour Linux (WSL). | Définissez PowerShell 7 (recommandé) ou Windows PowerShell 5.1 comme interpréteur de commandes par défaut dans Visual Studio Code. |
Étapes suivantes
Pour en savoir plus sur le développement de Functions à l’aide de PowerShell, consultez Guide des développeurs PowerShell sur Azure Functions.