azure - Azure Function 崩溃的日志和内存转储在哪里?
问题描述
有时我的天蓝色功能失败,我没有记录发生了什么。函数只是停止执行。我认为存在像 StackOverflow 这样的重大错误,但由于没有记录,我无法确定。
我创建了一个简单的天蓝色函数来模拟简单的堆栈溢出:
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log, ExecutionContext executionContext)
{
RunStackOverflow();
}
private static void RunStackOverflow()
{
RunStackOverflow();
}
当我使用 http 触发器调用它时,我在浏览器中收到 502 错误,但日志中没有关于此故障的任何内容。截图:https ://www.screencast.com/t/ymWoBey4KX
StackOverflow 只是无法捕获并可能导致函数崩溃的异常之一。在本地,当我在模拟器中运行该函数时,我在函数启动的 cmd 窗口中看到堆栈溢出错误。截图:https ://www.screencast.com/t/f85U2KmdEBBt
在 Azure 门户中,我检查了:
- 函数调用(截图:https ://www.screencast.com/t/ufB1Zfthz )
- 功能日志(截图:https ://www.screencast.com/t/A2ix6yuSuJkE )
- 应用洞察(截图:https ://www.screencast.com/t/NyRFLDK23p )
但是在任何地方都没有此崩溃的日志条目。我联系了 Azure 支持,但到目前为止他们并没有太大帮助。
4月12日更新
使用 KUDU,我可以使用这样的命令创建内存转储
c:\devtools\sysinternals\procdump -e -ma -w 12268
这向我显示了所有线程的所有堆栈跟踪,这是我需要的,但仅在发生第一次机会异常时。
出现此类异常时触发内存转储的命令是:
c:\devtools\sysinternals\procdump -accepteula -e -g -ma 8844
但是当我运行它然后触发 StackOverflow 异常时,这是写到命令行的内容:
[11:37:36] 例外:E0434352.CLR
[11:37:36] 异常:C00000FD.STACK_OVERFLOW <--- 堆栈溢出
[11:37:37] 进程已退出。
[11:37:37] 未达到转储计数。
不幸的是,没有创建内存转储,所以我看不到导致堆栈溢出的堆栈跟踪。
我也试过:
c:\devtools\sysinternals\procdump -accepteula -e -g -ma -t 13244
-t 选项在进程退出时触发内存转储。
这实际上记录了函数崩溃时的内存转储。不幸的是,这个转储不包括 StackOverflow 的堆栈跟踪。在线程已经崩溃后,它似乎被转储了。
4月21日更新
此处描述了托管 Azure 函数的多种方法: https ://docs.microsoft.com/en-us/azure/azure-functions/functions-scale
最常见和默认的方式是消费计划。经过一系列的反复试验,我发现可用于检测和分析崩溃的诊断工具 ( https://www.screencast.com/t/DyT6Jpuqm2uo ) 不适用于消费计划。另一方面,它们可用于应用服务(基本和附加)和其他计划。Azure 支持人员告诉我,目前没有将其添加到消费计划的计划。
所以现在我使用应用服务计划创建了一个新的 Azure 函数,并且我能够使用诊断工具来记录故障转储。解决问题后,我计划回到消费计划,所以这有点小技巧,但它现在确实有效。
解决方案
目前,这个级别的日志支持的不是很好。
您可以通过此链接Diagnose and solve problems
使用azure 门户中的选项,但请注意,此选项中的某些功能(如 )仍在开发中。Application Crashes
脚步:
1.In azure portal -> your function app -> 点击Diagnose and solve problems
-> 然后点击Function App Down or Reporting Errors
链接。这是屏幕截图:
2.在报告完成生成之前等待一段时间->然后检查项目的开头red exclamation mark
(通过使用您的代码,错误详细信息在Web App Restarted
项目中。但它只显示一个常见的消息,如app crashes
,not stackoverflow
):