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 unlimited
sudo 内部相同的操作。
$ sudo -u user -- bash -c "ulimit -c"
unlimited
但仍请注意 Catskul 的(已接受的)答案中的 2 个警告!
答案3
似乎可以使用 -s 选项来完成,例如:
sudo -s "ulimit -c unlimited; ./segfaultProg"
但是有 2 个注意事项:
- 您可能需要使用
suid_dumpable
以下方式设置参数sysctl -w kernel.suid_dumpable=2
- 您可能需要将旧核心移开。显然,存在特殊规则,如果设置了 suid 位,并且那里已经有一个核心,则可能会拒绝写入核心。
请参阅以下内容了解详细信息: