如何在 Linux 上转储 .NET Core 应用程序

Posted

技术标签:

【中文标题】如何在 Linux 上转储 .NET Core 应用程序【英文标题】:How to Dump a .NET Core Application on Linux 【发布时间】:2017-06-23 12:59:45 【问题描述】:

我有一个已移植到 .NET Core 的 .NET 应用程序。我正在 Ubuntu 14.04 上对其进行测试。

我试图弄清楚当程序崩溃时如何获取 .dmp 文件或 Linux 等效文件。我打电话给Environment.FailFast,但据我所知,这不会像在 Windows 上那样生成 .dmp 文件。根据this case Environment.FailFast 应该创建一个转储,但如果是我找不到它。

此外,我尝试使用gcore 手动创建转储。这可行,但是生成转储需要很长时间(我的应用程序不是那么大),而且我无法在 gdb 中获得正确的调用堆栈,因为当我将 gdb 指向我的应用程序 dll 时,它无法识别它.

在 Linux 上获取 .NET Core 应用程序转储的最佳方法是什么?

谢谢!

【问题讨论】:

您在/var/crash 中有条目吗?当应用程序崩溃时,它应该在那里创建一个条目。 @MihailStancescu 不,/var/crash 是空的。 @MihailStancescu 我没有看到任何链接说文件夹/var/crash 将是转储的地方,你能澄清一下吗? 【参考方案1】:

linux coredump 的生成由/proc/sys/kernel/core_pattern 中的内容定义。如果某些信号(例如SIGSEGVSIGQUIT)导致进程终止,则进程内存的映像基本上会写入该文件。如果它以管道符号| 开头,则可以将其流式传输到执行转储分析的应用程序中。它记录在这里:http://man7.org/linux/man-pages/man5/core.5.html

如果你这样配置:

   echo coredump > /proc/sys/kernel/core_pattern

它将一个名为coredump的文件写入当前目录。

如果你这样配置:

   echo "/tmp/cores/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern

它将创建一个类似/tmp/cores/core.bash.8539.drehbahn-mbp.1236975953 的文件(参见https://sigquit.wordpress.com/2009/03/13/the-core-pattern/)

正如其他人建议的那样,还设置 ulimit -S -c unlimited 以允许任何大小的核心转储。

这是一篇博文,展示了如何在 linux 下创建和分析 .NET Core 核心转储:http://blogs.microsoft.co.il/sasha/2017/02/26/analyzing-a-net-core-core-dump-on-linux/

【讨论】:

我尝试了echo core > /proc/sys/kernel/core_pattern,并通过在/etc/systemd/system 下写入文件将我的.NET CORE 2.1 控制台应用程序添加到Daemon 模式,我终止了进程但找不到转储文件,有什么建议吗? 我也有同样的问题。【参考方案2】:

你想要一个核心转储,这是内置在操作系统中的。

首先ulimit -Sc unlimited 作为您要运行该进程的用户,因此允许创建任何大小的核心文件。 然后kill -4 <pid>

这应该会生成核心转储。 它可能应该在运行进程的目录中。

如果您无法以运行应用程序的用户身份登录,则需要将其放入limits.conf。

【讨论】:

我运行了ulimit -Sc unlimited,然后启动了一个dotnet进程。运行kill -4 <dotnet_pid> 后,我在dll 位置或var/crash 中找不到任何核心转储文件@ /var/crash 是否可以被用户写入? (它应该设置了粘性位,但某些发行版禁用了它。) @dond 是的,用户可以写信给/var/crash【参考方案3】:

好消息!:现在您可以安装一个工具来自动获取转储。

首先你运行dotnet tool install -g dotnet-dump 然后你可以dotnet-dump [-h|--help] [--version] <command>

有关更多信息和示例,请参阅:https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-dump

【讨论】:

【参考方案4】:

我可以通过在我的 C# 代码中使用 Environment.FailFast("core dump") 来获取核心转储。也许您需要先使用ulimit -c unlimitedecho coredump > /proc/sys/kernel/core_pattern 设置核心转储大小和位置。

[xxx/tmp]$ ls core*

core.dotnet.10470

【讨论】:

以上是关于如何在 Linux 上转储 .NET Core 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 中转储解析的 JWT 令牌?

Linux 中的核心转储文件是啥?它提供啥信息?

在 Linux 上创建核心转储

如何在Linux服务器上部署Net Core

如何在 Windows 机器上为 Linux 编译 .NET Core 应用程序

如何在 montavista linux 上为守护进程启用核心转储?