Bagikan melalui


Debug PowerShell Azure Functions secara lokal

Azure Functions memungkinkan Anda mengembangkan fungsi Anda sebagai skrip PowerShell.

Anda dapat men-debug fungsi PowerShell secara lokal seperti yang Anda lakukan pada skrip PowerShell menggunakan alat pengembangan standar berikut:

  • Visual Studio Code: Editor teks gratis, ringan, dan sumber terbuka Microsoft dengan ekstensi PowerShell yang menawarkan pengalaman pengembangan PowerShell penuh.
  • Konsol PowerShell: Debug menggunakan perintah yang sama dengan yang akan Anda gunakan untuk men-debug proses PowerShell lainnya.

Azure Functions Core Tools mendukung debugging lokal untuk Azure Functions, termasuk fungsi PowerShell.

Contoh aplikasi fungsi

Aplikasi fungsi yang digunakan dalam artikel ini memiliki satu fungsi yang dipicu HTTP dan memiliki file berikut:

PSFunctionApp
 | - HttpTriggerFunction
 | | - run.ps1
 | | - function.json
 | - local.settings.json
 | - host.json
 | - profile.ps1

Aplikasi fungsi ini mirip dengan yang Anda dapatkan saat menyelesaikan quickstart PowerShell.

Kode fungsi dalam run.ps1 terlihat seperti skrip berikut:

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

Mengatur titik lampirkan

Untuk melakukan debug fungsi PowerShell apa pun, fungsi tersebut perlu berhenti agar dapat melampirkan debugger. Wait-Debugger Cmdlet menghentikan eksekusi dan menunggu debugger.

Nota

Saat menggunakan PowerShell 7, Anda tidak perlu menambahkan pemanggilan Wait-Debugger di dalam kode Anda.

Yang perlu Anda lakukan adalah menambahkan panggilan ke cmdlet Wait-Debugger tepat di atas instruksi if, sebagai berikut:

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"
}
# ...

Pemecahan masalah dimulai pada pernyataan if.

Dengan Wait-Debugger di tempat, Anda sekarang dapat men-debug fungsi menggunakan Visual Studio Code atau konsol PowerShell.

Debug di Visual Studio Code

Untuk men-debug fungsi PowerShell di Visual Studio Code, Anda harus menginstal hal berikut:

Setelah menginstal dependensi ini, muat proyek PowerShell Functions yang ada, atau buat proyek PowerShell Functions pertama Anda.

Nota

Jika proyek Anda tidak memiliki file konfigurasi yang diperlukan, Anda akan diminta untuk menambahkannya.

Mengatur versi PowerShell

PowerShell Core diinstal berdampingan dengan Windows PowerShell. Atur PowerShell Core sebagai versi PowerShell untuk digunakan dengan ekstensi PowerShell untuk Visual Studio Code.

  1. Tekan F1 untuk menampilkan palet perintah, lalu cari Session.

  2. Pilih PowerShell: Perlihatkan Menu Sesi.

  3. Jika sesi Saat ini bukan PowerShell Core 6, pilih Beralih ke: PowerShell Core 6.

Saat File PowerShell terbuka, Anda akan melihat versi yang ditampilkan berwarna hijau di kanan bawah jendela. Memilih teks ini juga menampilkan menu sesi. Untuk mempelajari selengkapnya, lihat Memilih versi PowerShell untuk digunakan dengan ekstensi.

Mulai aplikasi fungsi

Verifikasi bahwa Wait-Debugger diatur dalam fungsi tempat Anda ingin melampirkan debugger. Dengan Wait-Debugger ditambahkan, Anda dapat men-debug aplikasi fungsi menggunakan Visual Studio Code.

Pilih panel Debug lalu Lampirkan ke fungsi PowerShell.

Debugger

Anda juga dapat menekan tombol F5 untuk memulai debugging.

Operasi memulai debug menjalankan tugas-tugas berikut:

  • Jalankan func extensions install di terminal untuk menginstal ekstensi Azure Functions apa pun yang diperlukan oleh aplikasi fungsi Anda.
  • Jalankan func host start di terminal untuk memulai aplikasi fungsi pada Functions host.
  • Lampirkan debugger PowerShell ke runspace PowerShell dalam runtime Functions.

Nota

Anda perlu memastikan PSWorkerInProcConcurrencyUpperBound diatur ke 1 untuk memastikan pengalaman penelusuran kesalahan yang benar di Visual Studio Code. Ini adalah default.

Dengan aplikasi fungsi Anda berjalan, Anda memerlukan konsol PowerShell terpisah untuk memanggil fungsi yang dipicu HTTP.

Dalam hal ini, konsol PowerShell adalah klien. Invoke-RestMethod digunakan untuk memicu fungsi.

Di konsol PowerShell, jalankan perintah berikut:

Invoke-RestMethod "http://localhost:7071/api/HttpTrigger?Name=Functions"

Anda akan melihat bahwa respons tidak segera dikembalikan. Itu karena Wait-Debugger telah melampirkan debugger dan eksekusi PowerShell masuk ke mode istirahat sesegera mungkin. Ini karena konsep BreakAll, yang dijelaskan kemudian. Setelah Anda menekan tombol continue , debugger sekarang berhenti di baris tepat setelah Wait-Debugger.

Pada titik ini, debugger sudah terlampir dan Anda dapat melakukan semua operasi debugger seperti biasa. Untuk informasi selengkapnya tentang menggunakan debugger di Visual Studio Code, lihat dokumentasi resmi.

Setelah Anda melanjutkan dan menjalankan skrip sepenuhnya, Anda akan melihat bahwa:

  • Konsol PowerShell yang melakukan Invoke-RestMethod telah mengembalikan hasil
  • Konsol Terintegrasi PowerShell di Visual Studio Code sedang menunggu skrip dijalankan

Kemudian ketika Anda memanggil fungsi yang sama, debugger di ekstensi PowerShell berhenti tepat setelah Wait-Debugger.

Penelusuran kesalahan di Konsol PowerShell

Nota

Bagian ini mengasumsikan Anda telah membaca dokumen Azure Functions Core Tools dan tahu cara menggunakan func host start perintah untuk memulai aplikasi fungsi Anda.

Buka konsol, cd ke direktori aplikasi fungsi Anda, dan jalankan perintah berikut:

func host start

Dengan aplikasi fungsi berjalan dan Wait-Debugger siap, Anda dapat menyambungkan ke proses. Anda memerlukan dua konsol PowerShell lagi.

Salah satu konsol bertindak sebagai klien. Dari ini, Anda memanggil Invoke-RestMethod untuk memicu fungsi. Misalnya, Anda dapat menjalankan perintah berikut:

Invoke-RestMethod "http://localhost:7071/api/HttpTrigger?Name=Functions"

Anda akan menyadari bahwa tidak ada respons yang dikembalikan, yang merupakan akibat dari Wait-Debugger. Runspace PowerShell kini sedang menunggu agar debugger terpasang. Ayo kita lampirkan itu.

Di konsol PowerShell lainnya, jalankan perintah berikut:

Get-PSHostProcessInfo

Cmdlet ini mengembalikan tabel yang terlihat seperti output berikut:

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

Catat ProcessId untuk item dalam tabel dengan ProcessName sebagai dotnet. Proses ini adalah aplikasi fungsi Anda.

Selanjutnya, jalankan cuplikan berikut:

# 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

Setelah dimulai, debugger berhenti dan menampilkan sesuatu seperti output berikut:

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

Pada titik ini, Anda dihentikan di titik henti di debugger PowerShell. Dari sini, Anda dapat melakukan semua operasi debug biasa, melangkahi, melangkah ke, melanjutkan, keluar, dan lainnya. Untuk melihat kumpulan lengkap perintah debug yang tersedia di konsol, jalankan h perintah atau ? .

Anda juga dapat mengatur titik henti pada tingkat ini dengan Set-PSBreakpoint cmdlet.

Ketika Anda melanjutkan dan sepenuhnya memanggil skrip Anda, Anda akan melihat bahwa:

  • Konsol PowerShell tempat Anda menjalankan Invoke-RestMethod sekarang telah mengembalikan hasilnya.
  • Konsol PowerShell tempat Anda menjalankan Debug-Runspace sedang menunggu skrip dijalankan.

Anda dapat memanggil fungsi yang sama lagi (menggunakan Invoke-RestMethod misalnya) dan debugger berhenti tepat setelah Wait-Debugger perintah.

Hal-hal yang harus diperhatikan dalam penelusuran kesalahan

Perlu diingat masalah berikut saat men-debug kode Functions Anda.

BreakAll dapat menyebabkan debugger Anda rusak di tempat yang tidak terduga

Ekstensi PowerShell menggunakan Debug-Runspace, yang pada gilirannya bergantung pada fitur PowerShell BreakAll . Fitur ini memberi tahu PowerShell untuk berhenti pada perintah pertama yang dijalankan. Perilaku ini memberi Anda kesempatan untuk mengatur titik henti dalam runspace yang di-debug.

Runtime dari Azure Functions menjalankan beberapa perintah tertentu sebelum benar-benar memanggil skrip Anda run.ps1, jadi ada kemungkinan debugger akhirnya akan berhenti pada Microsoft.Azure.Functions.PowerShellWorker.psm1 atau Microsoft.Azure.Functions.PowerShellWorker.psd1.

Jika terjadi jeda ini, jalankan perintah continue atau c untuk melewatkan breakpoint ini. Anda kemudian berhenti di titik henti yang diharapkan.

Penyelesaian Masalah

Jika Anda mengalami kesulitan selama penelusuran kesalahan, Anda harus memeriksa hal-hal berikut ini:

Periksa Tindakan
Jalankan func --version dari terminal. Jika Anda mendapatkan kesalahan yang func tidak dapat ditemukan, Core Tools (func.exe) mungkin hilang dari variabel lokal path . Instal ulang Core Tools.
Di Visual Studio Code, terminal default harus memiliki akses ke func.exe. Pastikan Anda tidak menggunakan terminal default yang tidak menginstal Core Tools, seperti Subsistem Windows untuk Linux (WSL). Atur shell default di Visual Studio Code ke PowerShell 7 (disarankan) atau Windows PowerShell 5.1.

Langkah selanjutnya

Untuk mempelajari selengkapnya tentang mengembangkan Functions menggunakan PowerShell, lihat Panduan pengembang Azure Functions PowerShell.