2013-08-05 40 views
6

Các trang Wikipedia trên Core dump nóiBản thân một bản phân phối lõi có thể thực thi được không?

Trong các hệ thống Unix-like, lõi bãi thường sử dụng các tiêu chuẩn thực thi hình ảnh định dạng:

a.out in older versions of Unix, 
ELF in modern Linux, System V, Solaris, and BSD systems, 
Mach-O in OS X, etc. 

Điều này có nghĩa một bãi chứa lõi là thực thi bởi chinh no? Nếu không, tai sao không?

Chỉnh sửa: Vì @ WumpusQ.Wumbley đề cập đến một số coredump_filter trong nhận xét, có lẽ câu hỏi trên nên là: có thể một kết xuất lõi được tạo ra sao cho nó có thể thực thi được không?

+0

Bạn sẽ mong đợi điều gì nếu kết quả chính được thực thi? – icedwater

+0

Tôi tin (nhưng không chắc chắn) rằng kết xuất lõi chứa các hướng dẫn máy từ bản thực thi gốc cũng vì chúng là một phần của hình ảnh bộ nhớ của quá trình. Nếu vậy, tôi mong đợi nó sẽ chạy những hướng dẫn đó. Tôi hoàn toàn không rõ liệu điều này có xảy ra hay không, và liệu nó có hay không, cho dù nó sẽ bắt đầu lại hay sẽ cố gắng tiếp tục thực hiện từ trạng thái lưu trữ (và có thể sụp đổ một lần nữa), do đó câu hỏi. – sundar

+5

undump: http://code.google.com/p/undump/ –

Trả lời

6

Trong unix biến thể cũ đó là mặc định để bao gồm các văn bản cũng như dữ liệu trong các bãi chứa lõi nhưng nó cũng đã được đưa ra trong định dạng a.out chứ không phải ELF. Hành vi mặc định của ngày hôm nay (trong Linux chắc chắn, không chắc chắn 100% về các biến thể BSD, Solaris, v.v.) là có kết xuất lõi trong định dạng ELF mà không có phần văn bản nhưng hành vi đó có thể thay đổi.
Tuy nhiên, kết xuất lõi không thể được thực thi trực tiếp trong mọi trường hợp mà không cần trợ giúp. Lý do cho điều đó là có hai thứ thiếu trong một tệp lõi đơn giản. Một là điểm vào, còn lại là mã để khôi phục trạng thái CPU về trạng thái tại hoặc ngay trước khi kết xuất xảy ra (theo mặc định cũng là các phần văn bản bị thiếu).
Trong AIX có sử dụng được một tiện ích gọi là undump nhưng tôi không có ý tưởng những gì đã xảy ra với nó. Nó không tồn tại trong bất kỳ bản phân phối Linux chuẩn nào mà tôi biết. Như đã đề cập ở trên (@WumpusQ) cũng có một nỗ lực tại một dự án tương tự cho Linux được đề cập trong các bình luận ở trên, tuy nhiên dự án này chưa hoàn thành và không khôi phục trạng thái CPU về trạng thái ban đầu. Đó là, tuy nhiên, vẫn còn đủ tốt trong một số trường hợp gỡ lỗi cụ thể.
Điều đáng nói là có tồn tại các tệp được định dạng ELF khác mà không thể thực hiện tốt mà không phải là tệp lõi. Chẳng hạn như tệp đối tượng (đầu ra trình biên dịch) và tệp .so (đối tượng được chia sẻ). Những người yêu cầu một giai đoạn liên kết trước khi được chạy để giải quyết các địa chỉ bên ngoài.

+0

Cảm ơn bạn rất nhiều vì đã giải thích rõ ràng, và quan điểm về các tệp .o và .so là một tệp hợp lệ mà tôi không nghĩ đến. Tôi cũng có câu trả lời tương tự về điểm nhập, v.v ... từ tác giả của tiện ích 'undump', bây giờ tôi sẽ đăng bài đó như một câu trả lời khác vì mục đích hoàn chỉnh. Tôi chấp nhận câu trả lời của bạn nhưng để lại tiền thưởng mở ngay bây giờ, chỉ trong trường hợp. – sundar

+0

Một vấn đề lớn với khái niệm "undump" là bạn mất tất cả các trạng thái liên kết với các mô tả tập tin được mở tại thời điểm vụ tai nạn. –

+0

@ WumpusQ.Wumbley vâng, tác giả của 'undump' đã đề cập đến nó trong email của mình về điều này, tôi đã đăng câu trả lời đó như một câu trả lời khác về câu hỏi này. – sundar

1

Có hai loại bãi lõi: bãi lõi của hệ thống và bãi xử lý lõi. Chúng khác nhau ở nhiều khía cạnh, chẳng hạn như cách thức chúng được tạo ra và phương pháp được sử dụng để phân tích chúng.

Trong hầu hết các trường hợp, tín hiệu dẫn đến sự cố ứng dụng là SIGSEGV (vi phạm phân đoạn) hoặc SIGBUS.

loại tương tự của tín hiệu kích hoạt một bãi chứa lõi .. có lẽ gọi nó ..

1

tôi gửi qua email câu hỏi này các tác giả của các tiện ích undump cho chuyên môn của mình, và nhận được câu trả lời sau đây:

Như đã đề cập trong một số các câu trả lời đó, nó có thể bao gồm các phần đang bằng cách thiết lập coredump_filter, nhưng nó không phải là mặc định cho Linux (và tôi không hoàn toàn chắc chắn về các biến thể BSD và Solaris). Nếu các phần mã khác nhau được lưu trong khung gốc của , thì thực sự không có gì thiếu để tạo tệp thực thi mới. Tuy nhiên, nó đòi hỏi một số thay đổi trong tệp gốc lõi (chẳng hạn như bao gồm một điểm vào và chỉ nhập mục đó trỏ tới mã sẽ khôi phục thanh ghi CPU). Nếu tệp lõi là được sửa đổi theo cách này, nó sẽ trở thành tệp thực thi và bạn có thể để chạy tệp đó.Thật không may, mặc dù, một số tiểu bang sẽ không để được lưu để thực thi mới sẽ không thể chạy trực tiếp. Mở các tệp , ổ cắm, pips, v.v. sẽ không mở và thậm chí có thể trỏ đến các FD khác (có thể gây ra tất cả các thứ lạ). Tuy nhiên, nó có thể sẽ là đủ cho hầu hết các tác vụ gỡ lỗi như đang chạy các chức năng nhỏ từ gdb (để bạn không nhận được một "không chạy một công cụ thực thi" ).

0

Như những người khác đã nói, tôi không nghĩ bạn có thể thực thi tệp kết xuất lõi mà không có nhị phân gốc.

Trong trường hợp bạn muốn gỡ lỗi nhị phân (và nó có các biểu tượng gỡ lỗi đi kèm, nói cách khác nó không bị tước đi) thì bạn có thể chạy gdb binary core.

Bên trong gdb, bạn có thể sử dụng lệnh bt (backtrace) để lấy dấu vết ngăn xếp khi ứng dụng gặp sự cố.