2013-03-22 14 views
7

Voglio eseguire il dump del core di un processo in esecuzione che, in base allo /proc/<pid>/status, blocca attualmente sull'attività del disco. In realtà, è impegnato a lavorare sulla GPU (dovrebbe essere 4 ore di lavoro, ma ora ha impiegato molto più tempo). Mi piacerebbe sapere quanta parte del processo è stato svolto, quindi sarebbe bello poter scaricare la memoria del processo. Tuttavia, per quanto ne so, "bloccare l'attività del disco" significa che non è possibile interrompere il processo in alcun modo e correggere un processo, ad es. l'utilizzo di gdb richiede l'interruzione e l'interruzione temporanea del processo al fine di collegarsi tramite ptrace, giusto?È possibile eseguire il backup di un processo che blocca l'attività del disco (preferibilmente senza eliminarlo)?

So che potrei semplicemente leggere /proc/<pid>/{maps,mem} come root per ottenere lo stato (forse incoerente) della memoria, ma non conosco alcun modo per ottenere i valori del registro CPU dello spazio utente del processo ... rimangono gli stessi mentre il processo è all'interno del kernel, giusto?

+0

è possibile aggiungere la stampa dei registri ogni mezz'ora nel codice sorgente .... – 0x90

+0

Ovviamente, sarei molto più felice di una soluzione già pronta piuttosto che dover eseguire il rollup del mio creatore di file. :( – thejh

+0

@ 0x90 giusto, ma mi piacerebbe essere in grado di fare questo a un programma già in esecuzione perché non voglio perdere ~ 9h di dati calcolati con il riavvio forzato o attendere una quantità di tempo sconosciuta per questa cosa da completare (se non è bloccata da qualche parte). Inoltre, "ogni mezz'ora" non lo farebbe - dovresti sempre farlo prima di entrare in un metodo che potrebbe (o lo farà) bloccare su "disco" IO "per un periodo di tempo prolungato – thejh

risposta

3

Probabilmente è possibile eseguire gcore sul programma. È fondamentalmente un involucro attorno a GDB che si collega, utilizza il comando gcore e si scollega nuovamente.

Questo potrebbe interrompere il proprio IO (come se ricevesse un segnale, quale sarà), ma è probabile che il programma possa riavviarlo se scritto correttamente (e ciò potrebbe verificarsi in ogni caso, a causa della gestione predefinita).

+0

Come nota a margine, ho appena provato questo con un semplice programma di tipo hello.un richiamo a' read() 'riprende automaticamente – Hasturkun

+0

Cool! Puoi postare la fonte nella tua risposta? – Jess

+0

@Jessemon: per il mondo Ciao? Fondamentalmente 'char c; printf (" Ciao! \ N "); leggi (0, &c, 1);' Come ho detto, niente di intelligente. – Hasturkun

Problemi correlati