Coredumb
-
sicher das er dann auf jeden fall einen schreibt? Denn für eben dieses signal ist auch ein eigener signalhandler installiert. Ansonsten weiß ich nicht warum er den coredump nicht schreibt bzw wohin er ihn schreibt ich hab ja schon das limit auf 20 mb gesetzt aber das file ist nirgends zu finden.
-
Zum Testen kannst du ja mal einen Coredump provozieren mit
int *pointer; pointer = NULL; *pointer = 0;
Dann müsste eigentlich die Meldung "Segmentation fault (core dumped)" kommen und ein File "core" geschrieben werden.
-
hmm also das klappt immer noch nicht, oder wohin schreibt er den coredump eigentlich?
hier mal der anfang des programms
//! Die Hauptfunktion zum Testen // int main( int argc, char* argv[] ) { int res; rlimit rlp; res = getrlimit(RLIMIT_CORE, &rlp); std::cout<<"max core size: "<<rlp.rlim_cur<<std::endl; std::cout<<"current core size: "<<rlp.rlim_max<<std::endl; rlp.rlim_cur = 20000; res = getrlimit(RLIMIT_CORE, &rlp); if (res < 0) { std::cout<<"err: "<<errno<<std::endl; perror("setrlimit: RLIMIT_CORE"); exit(-2); } int * ptr = NULL; *ptr = 1;
was hab ich noch nicht beachtet?
-
Bei mir funktioniert das ohne Probleme:
~ % ulimit -c unlimited ~ % ./test max core size: 4294967295 current core size: 4294967295 zsh: segmentation fault (core dumped) ./test ~ % ls core core ~ %
-
hmm klappt bei mir nicht.... dabei sollte ich noch erwähnen das ich nicht owner der anwendung bin.... sondern diese nur über sudo starte.... könnte es daran liegen? Was muss ich da einstellen ?
-
Fedaykin schrieb:
hmm klappt bei mir nicht.... dabei sollte ich noch erwähnen das ich nicht owner der anwendung bin.... sondern diese nur über sudo starte.... könnte es daran liegen? Was muss ich da einstellen ?
Tja, die ulimits werden wohl kaum übernommen werden, kannst Du das Progamm nicht irgendwie anders starten?
-
hmm ich nicht .... naja ggf per script aber dort müsste das auch gesetzt sein
kann ich das nirgendswie softwaretechnisch vorher erhöhen bzw forcen das das ulimit -c benutzt wird?
-
also nochmal genau.... was muss ich genau für den coredumb setzen...
muss ich vorher händisch ulimit -c xxxxx ausführen bevor ich das programm starte? Kann das irgendwie im programm gemacht werden?
eigentlich mit setrlimit() (hat mir keiner gesagt das ich nen schreibfehler drinnen hab und nochmal ein get mache *gg*)
Aber das darf ich derweil nicht weil ich kein root bin? Welche rechte braucht der nutzer damit das innerhalb des programms geht.
Das programm wird mit sudo -u <nutzername> programmname
gestartet.... wie kann ich es nun also dazu bringen zu coredumben
-
Fedaykin schrieb:
also nochmal genau.... was muss ich genau für den coredumb setzen...
muss ich vorher händisch ulimit -c xxxxx ausführen bevor ich das programm starte? Kann das irgendwie im programm gemacht werden?
Das ulimit ist ein Shell-Builtin und setzt das für Deine Shell, sodass es für alle aus ihr gestarteten Programme verwendet wird.
eigentlich mit setrlimit() (hat mir keiner gesagt das ich nen schreibfehler drinnen hab und nochmal ein get mache *gg*)
Ja, setrlimit ist eine gute Idee. Der Schreibfehler ist mir einfach nicht aufgefallen, habe das Programm nur überflogen.
Aber das darf ich derweil nicht weil ich kein root bin? Welche rechte braucht der nutzer damit das innerhalb des programms geht.
An sich brauchst Du dazu keine speziellen Rechte. Mach mal ein "strace -e open", vielleicht passt irgendwas mit den Zugriffsrechten nicht, und das Programm darf einfach nicht in das Arbeitsverzeichnis schreiben, weil es ja mit den Rechten des anderen Users läuft.[/quote]
Habe gerade folgendes getestet, was auch ohne Probleme funktioniert:
#include <iostream> #include <sys/resource.h> #include <errno.h> //! Die Hauptfunktion zum Testen // int main( int argc, char* argv[] ) { int res; rlimit rlp; res = getrlimit(RLIMIT_CORE, &rlp); std::cout<<"max core size: "<<rlp.rlim_cur<<std::endl; std::cout<<"current core size: "<<rlp.rlim_max<<std::endl; rlp.rlim_cur = 20000; rlp.rlim_max = 25000; res = setrlimit(RLIMIT_CORE, &rlp); if (res < 0) { std::cout<<"err: "<<errno<<std::endl; perror("setrlimit: RLIMIT_CORE"); exit(-2); } int * ptr = NULL; *ptr = 1; }
-
ahh danke, geht jetzt ich muss trotzdem ulimit vorher aufrufen aber ab dann läufts. Hat mir auch schon sehr geholfen segfaults zu finden.