Kết xuất lõi xử lý mà không giết chết quá trình


12

Có cách nào để có được một bãi chứa lõi (hoặc một cái gì đó tương tự) cho một quy trình mà không thực sự giết chết các quy trình không? Tôi có một quá trình python đa luồng chạy trên một hệ thống nhúng. Và tôi muốn có thể có được một ảnh chụp nhanh về quy trình trong điều kiện bình thường (nghĩa là với các quy trình khác bắt buộc phải chạy), nhưng tôi không có đủ bộ nhớ để kết nối gdb (hoặc chạy nó dưới gdb) mà không cần quá trình python là người duy nhất đang chạy

Tôi hy vọng câu hỏi này có ý nghĩa.


Nếu đây chỉ là khi bạn gỡ lỗi, bạn đã xem xét một thứ điên rồ như trao đổi trên tệp NFS hoặc thiết bị chặn mạng chưa?
Gilles 'SO- đừng trở nên xấu xa'

Câu trả lời:


13

Thủ thuật thông thường là có một cái gì đó (có thể là tín hiệu như SIGUSR1) kích hoạt chương trình fork(), sau đó đứa trẻ gọi abort()để tự biến mình thành lõi.

from os import fork, abort
(...)
def onUSR1(sig, frame):
    if os.fork == 0:
        os.abort

và trong quá trình khởi tạo

from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)

Được sử dụng theo cách này, forksẽ không tiêu tốn nhiều bộ nhớ vì hầu hết không gian địa chỉ sẽ được chia sẻ (đó cũng là lý do tại sao điều này hoạt động để tạo kết xuất lõi).

Đã có lúc thủ thuật này được sử dụng với một chương trình được gọi undumpđể tạo ra một tệp thực thi từ kết xuất lõi để lưu hình ảnh sau khi khởi tạo phức tạp; emacsđược sử dụng để làm điều này để tạo ra một hình ảnh tải sẵn từ temacs.


5

Bạn có thể thử sử dụng gcore. Đó có phải là một lựa chọn cho bạn?


Tại một số thời điểm, gcore là một chương trình độc lập nhưng tôi không nghĩ đó là một phần của gói gdb nữa - tuy nhiên bạn có thể chạy gdb --pid = <PID> và sau đó sử dụng lệnh gcore của nó để kết xuất tệp lõi. gcore.c là một chương trình khá đơn giản, có thể dễ dàng googlable nếu bạn muốn một cái gì đó nhẹ hơn.
tổng
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.