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

时间:2017-02-06 14:33:59

标签: .net linux .net-core dump

我有一个.NET应用程序,我已移植到.NET Core。我在Ubuntu 14.04上测试它。

我试图弄清楚如何在程序崩溃时获取.dmp文件或Linux等效文件。我打电话给Environment.FailFast,但据我所知,这并没有像在Windows上那样生成.dmp文件。根据{{​​3}} Environment.FailFast应该创建转储,但如果是,我无法找到它。

此外,我尝试使用gcore手动创建转储。这可行但是生成转储需要很长时间(我的应用程序不是那么大)并且我无法在gdb之后获得正确的callstacks,因为当我将gdb指向我的应用程序时它没有&#39 ;认识它。

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

谢谢!

4 个答案:

答案 0 :(得分:3)

linux coredumps的生成由/proc/sys/kernel/core_pattern中的内容定义。如果某些信号(例如SIGSEGV或SIGQUIT)导致进程终止,则进程的存储器的映像基本上被写入该文件。如果它以管道符号|开头,则可以将其流式传输到执行转储分析的应用程序。它在此处记录: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以允许任何大小的coredump。

这是一篇博文,介绍如何在linux下创建和分析.NET Core coredump:http://blogs.microsoft.co.il/sasha/2017/02/26/analyzing-a-net-core-core-dump-on-linux/

答案 1 :(得分:2)

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

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

这应该生成核心转储。 它应该位于运行进程的目录中。

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:-1)

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

  

[xxx / tmp] $ ls core *

     

core.dotnet.10470