2015-06-18 5 views
5

Ich möchte in der Lage sein, einen Core-Dump zu generieren, aber den Prozess danach nicht beenden. Ich brauche es nicht, um weiterzumachen, stirb einfach nicht. Dies ist ein C++ - Ubuntu-Prozess.Ist es möglich, den Kern zu entladen, aber den Prozess nicht zu beenden?

Ich glaube, ich kippe den Kern auf eine ziemlich standardmäßige Weise: Ich fange das störende Signal über die Einstellung der Signal-Handler mit Signal(), ich setze die Kerngröße Grenze über setrlimit() und dann fordere ich den Core-Dump mit Signal() und erhöht():

signal(SIGSEGV, OnPosixSignal); 

... 

void OnPosixSignal(int iSignal) 
{ 
    struct rlimit CoreLimit; 
    CoreLimit.rlim_cur = RLIM_INFINITY; 
    CoreLimit.rlim_max = RLIM_INFINITY; 
    setrlimit(RLIMIT_CORE, &CoreLimit); 
    signal(iSignal, SIG_DFL); 
    raise(iSignal); 
} 

gibt es etwas, was ich tun kann, den Prozess nicht haben, Ausfahrt nach dem Kern Dumping?

Vielen Dank im Voraus!

+3

Haben Sie sich einmal angesehen, wie 'gcore' das macht? –

+0

Ich habe 'setrlimit() 'nicht in der Liste der async-sicheren Funktionen gefunden. Sind Sie sicher, dass es eine gute Idee ist, sie in einem Signal-Handler aufzurufen? – EOF

+1

'Coredumper' Bibliothek wird dein Freund sein. –

Antwort

1

können Sie auch tun, dass gcore mit:

generieren einen Core-Dump eines laufenden Programms mit Prozess-ID pid. Produzierte Datei entspricht einer Kernel-produzierten Core-Datei, als ob der Prozess abgestürzt wäre (und wenn "ulimit -c" verwendet wurde, um ein geeignetes Core-Dump-Limit einzurichten). Anders als nach einem Absturz bleibt das Programm nach dem gcore ohne Änderung laufen.

Verwandte Themen