2013-03-22 22 views
7

Tôi muốn bỏ lõi của một tiến trình đang chạy, theo /proc/<pid>/status, hiện đang chặn hoạt động của đĩa. Trên thực tế, nó đang bận rộn làm việc trên GPU (nên được 4 giờ làm việc, nhưng nó đã mất nhiều thời gian hơn bây giờ). Tôi muốn biết có bao nhiêu công việc của quá trình đã được thực hiện, do đó, nó sẽ là tốt để có thể đổ bộ nhớ của quá trình. Tuy nhiên, theo như tôi biết, "chặn hoạt động trên đĩa" có nghĩa là không thể làm gián đoạn quá trình theo bất kỳ cách nào và coredumping quy trình, ví dụ: sử dụng gdb yêu cầu gián đoạn và tạm thời dừng quá trình để đính kèm qua ptrace, phải không?Tôi có thể coredump một quá trình đang chặn hoạt động đĩa (tốt nhất là không giết nó)?

Tôi biết rằng tôi chỉ có thể đọc /proc/<pid>/{maps,mem} làm gốc để nhận trạng thái bộ nhớ (có thể không nhất quán), nhưng tôi không biết cách nào để giữ các giá trị đăng ký CPU của người dùng ... quá trình là bên trong hạt nhân, phải không?

+0

bạn có thể thêm bản in của sổ đăng ký mỗi nửa giờ trong mã nguồn của bạn .... – 0x90

+0

Tất nhiên, tôi sẽ vui hơn về giải pháp làm sẵn hơn là phải cuộn nhà sản xuất coredump của riêng tôi. :( – thejh

+0

@ 0x90 đúng, nhưng tôi muốn có thể làm điều này với một chương trình đã chạy vì tôi không muốn mất ~ 9h dữ liệu được tính bằng cách khởi động lại hoặc chờ một khoảng thời gian không xác định điều này để hoàn thành (nếu nó không bị mắc kẹt ở đâu đó.), "mỗi nửa giờ" sẽ không làm điều đó - bạn phải luôn luôn làm điều đó trước khi nhập một phương pháp có thể (hoặc sẽ) chặn trên "đĩa IO "trong một khoảng thời gian kéo dài – thejh

Trả lời

3

Bạn có thể chạy gcore trên chương trình của mình. Về cơ bản, nó là một trình bao bọc xung quanh GDB đính kèm, sử dụng lệnh gcore và gián đoạn lại.

Điều này có thể làm gián đoạn IO của bạn (như thể nó nhận được tín hiệu), nhưng chương trình của bạn có thể khởi động lại nếu được viết đúng (và điều này có thể xảy ra trong mọi trường hợp, do xử lý mặc định).

+0

Như một lưu ý phụ, tôi chỉ thử điều này với một chương trình kiểu chào thế giới đơn giản. Một cuộc gọi tới' read() 'được tiếp tục tự động. – Hasturkun

+0

Thật tuyệt! Bạn có thể đăng nguồn vào câu trả lời không? – Jess

+0

Đó là về cơ bản 'char c; printf (" Hi! \ N "); đọc (0, &c, 1);' Như tôi đã nói, không có gì thông minh. – Hasturkun

Các vấn đề liên quan