如何在 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
中的内容定义。如果某些信号(例如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
以允许任何大小的核心转储。
这是一篇博文,展示了如何在 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 unlimited
和echo coredump > /proc/sys/kernel/core_pattern
设置核心转储大小和位置。
[xxx/tmp]$ ls core*
core.dotnet.10470
【讨论】:
以上是关于如何在 Linux 上转储 .NET Core 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core 中转储解析的 JWT 令牌?