Không chặn kết xuất lõi trên Linux?


24

Tôi đang tìm kiếm một cách để có được một quy trình không xâm phạm của một quy trình đang chạy trên Linux.

Tôi quen thuộc với gdb gcore, nhưng nó chỉ có thể chạy khi gdbđược gắn vào quy trình và nó đã dừng để gỡ lỗi. Đối với một bãi chứa lõi lớn có thể có nghĩa là nhiều giây, hoặc thậm chí vài phút, thực thi bị gián đoạn.

Có bất kỳ thay thế không chặn?

Linux hỗ trợ bộ nhớ sao chép, mà nó dựa vào để hỗ trợ fork()mà không cần exec(). Vì vậy, tôi đang nghĩ đến một cái gì đó ở cấp độ kernel, trong đó kernel chụp ảnh sao chép khi ghi của các bảng trang quy trình của quá trình đang bị hủy, sau đó ghi lõi ra trong khi tiến trình ban đầu tiếp tục chạy.

Tôi khá chắc chắn rằng tôi có thể sử dụng gdbđể ép buộc một fork()đứa trẻ sau đó bỏ rơi đứa trẻ trong khi cha mẹ tiếp tục vui vẻ, sau đó wait()ở trong cha mẹ để gặt con sau khi chấm dứt. Mặc dù vậy, nó lộn xộn và vẫn đòi hỏi hai sự gián đoạn của quá trình cha mẹ, mặc dù ngắn.

Chắc chắn ai đó cần điều này trước đây?


Tôi xin lỗi vì tôi chỉ có thể đưa ra một upvote duy nhất cho câu hỏi tuyệt vời này.
peterh nói rằng phục hồi Monica

Câu hỏi tuyệt vời và tôi, cho một, đang mong chờ câu trả lời. +1 từ tôi
thanasisk

1
Điều gì về 1) gắn quy trình với gdb 2) để cho nó được rẽ nhánh bởi lệnh "gọi ngã ba" 3) bỏ lõi của quy trình con 4) để cho đứa trẻ chết chờ cha mẹ (một "cuộc gọi chờ 4" khác) ) tách ra khỏi quy trình 6) tự động hóa 1-5? Gdb sử dụng các lệnh gọi hệ thống sys_ptrace () đơn giản, nó có thể là một công cụ C không thực sự phức tạp hoàn toàn độc lập với gdb.
peterh nói phục hồi Monica

1
Trên một máy ảo, bạn có thể chụp ảnh nhanh và đưa nó lên dưới dạng bản sao để phân tích. Có lẽ một trong những công cụ được liệt kê ở đây sẽ giúp bạn: cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni

1
Bạn có thể tránh sự gián đoạn thứ hai bằng cách xử lý con cũng rẽ nhánh và sau đó thoát. Sau đó, quá trình cha mẹ có thể đợi con ngay lập tức và sau đó tiếp tục, trong khi ông bà bỏ lõi.
kasperd

Câu trả lời:


1

Google CoreDumper lò xo để tâm. Nó tạo một bản sao sao chép trên không gian địa chỉ của tiến trình, xem WriteCoreDump () (xem "Ghi chú").


Điều đó có vẻ cực kỳ hữu ích! Tôi tự hỏi những gì các kỹ thuật cơ bản được sử dụng là. Có lẽ nó thúc đẩy quá trình, nhưng việc tạo ra ảnh chụp nhanh CoW mà không cần giả mạo và theo cách không ảnh hưởng đến (các) ngăn xếp sẽ là một thách thức. Tôi sẽ phải xem mã. Mẹo tuyệt vời.
Craig Ringer

Có vẻ như chỉ trong quá trình xử lý, không may, và không thể được gọi thông qua gdb hoặc tương tự vì nó yêu cầu bản thân nó. Vì vậy, nó hơi giống với DLL gỡ lỗi trong Windows, thay vì giống như một gcore không chặn, nhưng vẫn rất tiện dụng. Tôi đoán có thể sử dụng thông qua hook LD_PRELOAD và thiết lập trình xử lý tín hiệu với gdb, tách và báo hiệu quá trình, nhưng có vẻ như nó thực sự được thiết kế để kết xuất các chương trình chưa sửa đổi và nó có vấn đề được chia sẻ bởi bất kỳ công cụ kết xuất trong quy trình nào mà nếu quy trình bị rối đủ thì kết xuất sẽ không hoạt động.
Craig Ringer

Xin lỗi, tôi đã bỏ lỡ bit "không xâm phạm" khi lần đầu tiên đọc câu hỏi.
EricM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.