gpt4 book ai didi

amazon-web-services - 如何检测 Dart VM 崩溃的原因

转载 作者:行者123 更新时间:2023-12-04 08:16:45 24 4
gpt4 key购买 nike

我有两个在 Amazon (AWS Ubuntu) 上运行的 Dart 应用程序,它们是:

  1. 自托管 http API
  2. 处理计时器后台任务的 worker

这两个应用程序都使用 PostgreSQL。他们偶尔会崩溃,所以除了试图找到根本原因外,我还实现了一个监督脚本,它只检测这两个主要应用程序是否正在运行并根据需要重新启动它们。

现在我要解决的问题是supervisor脚本崩溃,或者VM崩溃。它每隔几天发生一次。

我不认为这是内存泄漏,因为如果我将轮询率从 10 秒增加到更频繁 (1 ns),它会在 Dart Observatory 中正确显示它耗尽 30MB,然后进行垃圾收集并重新开始内存使用率低,并保持循环。

不认为这是一个未捕获的异常,因为无限循环完全包含在 try/catch 中。

我不知道还能尝试什么。如果虚拟机真的崩溃了,是否有可以检查的虚拟机转储文件?还有其他技术可以调试根本原因吗? Dart 是否不够稳定,无法一次运行数天的应用程序?

这是主管脚本中代码的主要部分:

 ///never ending function checks the state of the other processes
Future pulse() async {
while (true) {
sleep(new Duration(milliseconds: 100)); //DEBUG - was seconds:10
try {
//detect restart (as signaled from existence of restart.txt)
File f_restart = new File('restart.txt');
if (await f_restart.exists()) {
log("supervisor: restart detected");
await f_restart.delete();
await endBoth();
sleep(new Duration(seconds: 10));
}

//if restarting or either proc crashed, restart it
bool apiAlive = await isRunning('api_alive.txt', 3);
if (!apiAlive) await startApi();
bool workerAlive = await isRunning('worker_alive.txt', 8);
if (!workerAlive) await startWorker();

//if it's time to send mail, run that process
if (utcNow().isAfter(_nextMailUtc)) {
log("supervisor: starting sendmail");
Process.start('dart', [rootPath() + '/sendmail.dart'], workingDirectory: rootPath());
_nextMailUtc = utcNow().add(_mailInterval);
}

} catch (ex) {}
}
}

最佳答案

如果你有天文台,你可以通过以下方式获得故障转储: curl localhost:<your obseratory port>/_getCrashDump

我不完全确定这是否相关但是 Process.start返回一个 future ,如果它以错误完成,我认为它不会被你的 try/catch 捕获...<​​/p>

关于amazon-web-services - 如何检测 Dart VM 崩溃的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40077691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com