In neueren Linux-Versionen (seit 2.6.36) können Sie mithilfe des prlimitBefehls und des Systemaufrufs Ressourcenbeschränkungen für einen beliebigen Prozess festlegen (bei entsprechenden Berechtigungen):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
Sie benötigen util-linux-2.21 für den Befehl prlimit, sollten aber in der Lage sein, ein schnelles Programm zusammenzustellen, um den Systemaufruf prlimit aufzurufen. Andernfalls:
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Wenn Sie nicht über eine ausreichend neue Version von Linux (oder einem anderen Betriebssystem) verfügen, ist das einzige gdbProblem, setrlimitdas mir bekannt ist, die Verbindung zum Prozess mit dem Debugger herzustellen und dieses Problem zu beheben :
$ gdb -p $PID
...
(gdb) set $rlim = &{0ll, 0ll}
(gdb) print getrlimit(9, $rlim)
$1 = 0
(gdb) print *$rlim
$2 = {-1, -1}
(gdb) set *$rlim[0] = 1024*1024
(gdb) print setrlimit(9, $rlim)
$3 = 0
Dies ist für die Einstellung ulimit -m, RLIMIT_AS = 9; genau das gleiche gilt für ulimit -c( RLIMIT_CORE, numerischer Wert 4unter Linux auf x86-64). Verwenden Sie für "unbegrenzt" RLIM_INFINITYin der Regel -1. Sie sollten überprüfen, /usr/include/bits/types.hwie groß diese rlim_tist. Ich gehe davon aus long long(es ist eigentlich ohne Vorzeichen, aber die Verwendung eines vorzeichenbehafteten Typs macht "unbegrenzt" -1 leichter lesbar).
gdbTechnik ist wirklich cool. Eine Einschränkung ist, dass Sie die Anzahl der geöffneten Dateien für einen Nicht-Root-Prozess nicht über das harte Limit hinaus erhöhen können. DersetrlimitAufruf gibt -1 zurück und errno ist 22 (ungültiges Argument).