使用 sudo 运行程序时会创建核心转储吗?

使用 sudo 运行程序时会创建核心转储吗?

sudo尽管设置为无限制,但使用时核心显然不会被转储ulimit -c。有什么办法可以解决这个问题吗?

答案1

sudo 将重置核心转储设置,就像它对许多其他环境状态所做的那样。您可以通过助手运行该程序,该助手首先启用核心转储,然后运行该程序。例如,创建一个包装器/usr/local/bin/coredump,然后chmod +x

$ cat /usr/local/bin/coredump

#!/bin/sh
ulimit -c unlimited
exec "$@"

然后

sudo /usr/local/bin/coredump /your/crashing/program

答案2

由于 sudo1.9.11,根据man 5 sudoers手册和这个 github 评论证实了这一点。这意味着您ulimit -c在 shell 中为 所做的任何设置,或 中的任何内容/etc/limits.conf/etc/security/limits.conf/etc/login.defs将被 sudo:即完全覆盖。

$ ulimit -c
134
$ sudo -u user -- bash -c "ulimit -c"
0

Defaults rlimit_core=infinity在 /etc/sudoers 文件(或类似文件,例如 /etc/sudoers.d/90-coredumpsize)中使用此行让 sudo 执行与ulimit -c unlimitedsudo 内部相同的操作。

$ sudo -u user -- bash -c "ulimit -c"
unlimited

但仍请注意 Catskul 的(已接受的)答案中的 2 个警告!

答案3

似乎可以使用 -s 选项来完成,例如:

sudo -s "ulimit -c unlimited; ./segfaultProg"

但是有 2 个注意事项:

  1. 您可能需要使用suid_dumpable以下方式设置参数sysctl -w kernel.suid_dumpable=2
  2. 您可能需要将旧核心移开。显然,存在特殊规则,如果设置了 suid 位,并且那里已经有一个核心,则可能会拒绝写入核心。

请参阅以下内容了解详细信息:

http://www.randombugs.com/linux/core-dumps-linux.html

相关内容