我有一个.NET应用程序,我已移植到.NET Core。我在Ubuntu 14.04上测试它。
我试图弄清楚如何在程序崩溃时获取.dmp文件或Linux等效文件。我打电话给Environment.FailFast
,但据我所知,这并没有像在Windows上那样生成.dmp文件。根据{{3}} Environment.FailFast
应该创建转储,但如果是,我无法找到它。
此外,我尝试使用gcore
手动创建转储。这可行但是生成转储需要很长时间(我的应用程序不是那么大)并且我无法在gdb之后获得正确的callstacks,因为当我将gdb指向我的应用程序时它没有&#39 ;认识它。
在Linux上转储.NET Core应用程序的最佳方法是什么?
谢谢!
答案 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 unlimited
和echo coredump > /proc/sys/kernel/core_pattern
来设置核心转储大小和位置。
[xxx / tmp] $ ls core *
core.dotnet.10470