偵錯指導方針
適用於: SDK v4
Bot 是複雜的應用程式,許多元件會一起運作。 就像任何其他複雜的應用程式一樣,這可能會導致一些有趣的錯誤,或導致 Bot 的行為與預期不同。
偵錯,您的 Bot 有時可能很困難。 每個開發人員都有自己完成這項工作的慣用方式。 下列指導方針是適用於大部分 Bot 的建議。
確認 Bot 是否正常運作之後,下一個步驟就是將 Bot 連線到通道。 若要這樣做,您可以將 Bot 部署至預備伺服器,並建立自己的直接線路用戶端,讓 Bot 連線。 如需詳細資訊,請參閱 將 Bot 連線到 Direct Line。
建立您自己的用戶端可讓您定義通道的內部工作,並測試 Bot 如何回應特定活動交換。 線上到客戶端之後,請執行測試來設定 Bot 狀態並驗證您的功能。 如果您的 Bot 使用語音之類的功能,使用這些通道可以提供驗證該功能的方式。
注意
將 Bot 部署至 Azure 時,預設會佈建 網路聊天 通道。
透過此處的 Azure 入口網站 使用 Bot Framework 模擬器和 網路聊天,可讓您進一步深入瞭解 Bot 在與不同通道互動時的表現。
偵錯 Bot 的運作方式與其他多線程應用程式類似,能夠設定斷點或使用即時視窗等功能。
Bot 會遵循事件驅動程式設計範例,如果您不熟悉,則很難合理化。 Bot 無狀態、多線程和處理異步/await 呼叫的概念可能會導致非預期的 Bug。 偵錯 Bot 的運作方式與其他多線程應用程式類似,但我們將討論一些建議、工具和資源來協助。
使用模擬器瞭解 Bot 活動
您的 Bot 除了一般訊息活動之外,還處理不同類型的活動。 了解這些活動可協助您有效率地撰寫 Bot 的程式代碼,並可讓您確認 Bot 所傳送和接收的活動是您預期的活動。 使用模擬器會顯示這些活動是什麼、發生時,以及其包含的資訊。 如需詳細資訊,請參閱 使用模擬器進行偵錯。
儲存和擷取使用者與文字記錄的互動
Azure Blob 文字記錄記憶體提供特殊的資源,您可以在 其中儲存和擷取包含使用者與 Bot 之間互動的文字記錄 。
此外,一旦儲存使用者輸入互動,您就可以使用 Azure 的「記憶體總管」,手動檢視 Blob 文字記錄存放區內儲存的文字記錄中包含的數據。 下列範例會從 「mynewtestblobstorage」 的設定開啟 「storage explorer」。。若要開啟已儲存的使用者輸入選取:Blob Container > ChannelId TranscriptId > ConversationId >
這會以 JSON 格式開啟預存的使用者交談輸入。 用戶輸入會與機碼 「text:」 一起保留。如需建立和使用 Bot 文字記錄檔的詳細資訊,請參閱 使用文字記錄檔案對 Bot 進行偵錯。
中間件的運作方式
第一次嘗試使用它時,中間件 可能不是直覺的,尤其是關於執行之接續或縮短運行時間。 中間件可以在回合的開頭或尾端邊緣上執行,並在執行傳遞至 Bot 邏輯時呼叫 next()
委派聽寫。
如果您使用多個中間件,而且它是管線導向的方式,委派可能會將執行傳遞至不同的中間件片段。 Bot 中間件管線的詳細數據可協助釐清該想法。
next()
如果未呼叫委派,這稱為「短線路路由」。 當中間件滿足目前活動並判斷不需要傳遞執行時,就會發生這種情況。
瞭解中間件的時機和原因,有助於指出管線中應該先出現哪一個中間件。 此外,瞭解預期對於 SDK 或其他開發人員所提供的內建中間件而言很重要。 有些發現先嘗試建立自己的中間件,先實驗一點,再深入探索內建中間件會很有説明。
如需如何使用檢查中間件偵錯 Bot 的詳細資訊,請參閱 使用檢查中間件對 Bot 進行偵錯。
了解狀態
追蹤狀態是 Bot 的重要組成部分,尤其是複雜工作。 一般而言,最佳做法是儘快處理活動,並讓處理完成,讓狀態持續保存。 活動幾乎可以同時傳送至您的 Bot,這可能會因為異步架構而造成混淆的錯誤。
最重要的是,請確定狀態會以符合您預期的方式保存。 視保存狀態所在的位置而定,Cosmos DB 和 Azure 資料表記憶體的記憶體模擬器可協助您在使用生產記憶體之前先確認該狀態。
重要
Cosmos DB 記憶體類別已被取代。 原本使用 CosmosDbStorage 建立的容器沒有分割區索引鍵集,而且已獲得 _/partitionKey 的預設分割區索引鍵。
使用 Cosmos DB 記憶體 建立的容器可以搭配 Cosmos DB 分割記憶體使用。 如需詳細資訊,請參閱 Azure Cosmos DB 中的數據分割。
另請注意,與舊版 Cosmos DB 記憶體不同,Cosmos DB 分割記憶體不會自動在您的 Cosmos DB 帳戶內建立資料庫。 您必須 手動建立新的資料庫,但請略過手動建立容器,因為 CosmosDbPartitionedStorage 會為您建立容器。
如何使用活動處理程式
活動處理程式可以引入另一層複雜度,特別是因為每個活動都會在獨立的線程上執行(或 Web 背景工作角色,視您的語言而定)。 視您的處理程式所執行的動作而定,這可能會導致目前狀態不是您預期的問題。
內建狀態會在回合結束時寫入,不過該回合所產生的任何活動都會獨立於回合管線執行。 這通常不會影響我們,但如果活動處理程式變更狀態,我們需要寫入狀態以包含該變更。 在此情況下,回合管線可以等候活動完成處理,再完成,以確保它記錄該回合的正確狀態。
傳送活動方法及其處理程式會造成唯一的問題。 只要從 傳送活動處理程式內的呼叫傳送活動,就會造成線程的無限分叉。 有一些方法可以解決這個問題,例如,將其他訊息附加至傳出資訊,或寫出至主控台或檔案等其他位置,以避免 Bot 損毀。
偵錯生產 Bot
當 Bot 處於生產環境中時,您可以使用 Dev Tunnel 從任何通道 對 Bot 進行偵錯。 Bot 與多個通道的無縫連線,是 Bot Framework 中可用的重要功能。 如需詳細資訊,請參閱 使用 devtunnel 從任何通道對 Bot 進行偵錯,以及 偵錯技能或技能取用者。
下一步
其他資源
- Visual Studio 偵錯
- Bot 架構的偵錯、追蹤和分析
- 針對您不想在實際執行程式碼中包含的方法使用 ConditionalAttribute
- 使用 Fiddler 之類的工具來查看網路流量
- 針對一般問題 進行疑難解答,以及該區段中的其他疑難解答文章