2012-01-12 27 views
5

Tôi có thể định cấu hình những gì đi vào một kết xuất lõi trên Linux không? Tôi muốn có được một cái gì đó giống như Windows-dumps nhỏ (thông tin tối thiểu về khung stack khi ứng dụng bị rơi). Tôi biết bạn có thể đặt kích thước tối đa cho các tệp lõi bằng cách sử dụng ulimit, nhưng điều này không cho phép tôi kiểm soát nội dung bên trong lõi (nghĩa là không đảm bảo rằng nếu tôi đặt giới hạn là 64kb, nó sẽ đổ 16 trang cuối cùng của ngăn xếp, ví dụ).Kết xuất lõi tối thiểu (ngăn xếp dấu vết + chỉ khung hiện tại)

Ngoài ra, tôi muốn thiết lập theo cách có lập trình (từ mã), nếu có thể. Tôi đã xem tệp /proc/PID/coredump_filter được đề cập bởi man core, nhưng có vẻ như quá thô sơ cho mục đích của tôi.

Để cung cấp một ngữ cảnh nhỏ: Tôi cần các tệp lõi nhỏ, vì nhiều lý do: tôi cần thu thập chúng qua mạng, cho nhiều (nghìn) khách hàng; hơn nữa, đây là những thiết bị nhúng với ít thẻ SD và modem GPRS cho kết nối mạng. Vì vậy, bất cứ điều gì trên ~ 200k là ra câu hỏi.

EDIT: Tôi đang làm việc trên thiết bị nhúng chạy Linux 2.6.24. Bộ xử lý là PowerPC. Thật không may, powerpc-linux là không hỗ trợ trong breakpad vào lúc này, vì vậy google breakpad không phải là một lựa chọn

+1

Tôi không biết, và câu trả lời có thể nằm bên trong mã nguồn hạt nhân (vì không có đặc tả nào liên quan đến điều đó). Tại sao bạn hỏi? Với các đĩa hiện tại, giới hạn kết xuất lõi 64Mb vẫn còn nhỏ và rất có thể chứa đủ thông tin. Tại sao bạn cần đặt giới hạn cho một giá trị nhỏ như vậy như 64kb. ? –

+3

Google Breakpad viết minidumps trên tất cả các nền tảng, bao gồm cả Linux. –

+0

Tôi hỏi vì tôi đang sử dụng một thiết bị nhúng, trong đó có một đĩa flash nhỏ và đặc biệt là kết nối gprs chậm để tải xuống dữ liệu .. Tôi muốn nó càng nhỏ càng tốt! –

Trả lời

5

Tôi có "giải quyết" vấn đề này theo hai cách:

  1. Tôi đã cài đặt trình xử lý tín hiệu cho SIGSEGV và sử dụng backtrace/backtrace_symbols để in dấu vết ngăn xếp. Tôi biên dịch mã của tôi với -rdynamic, do đó, ngay cả sau khi tước thông tin gỡ lỗi tôi vẫn nhận được một backtrace với các tên có ý nghĩa (trong khi vẫn giữ thực thi đủ nhỏ gọn).
    Tôi đã xóa thông tin gỡ lỗi và đặt nó vào một tệp riêng biệt, mà tôi sẽ lưu trữ ở đâu đó an toàn, sử dụng strip; từ đó, tôi sẽ sử dụng add22line với thông tin được lưu từ backtrace (địa chỉ) để hiểu nơi xảy ra sự cố. Bằng cách này tôi phải lưu trữ chỉ một vài byte.
  2. Ngoài ra, tôi thấy tôi có thể sử dụng/proc/self/coredump_filter để không đổ bộ nhớ (thiết lập nội dung của nó thành "0"): chỉ chuỗi và thông tin proc, thanh ghi, ngăn xếp vv được lưu trong lõi. Xem thêm trong this answer

Tôi vẫn mất thông tin có thể là quý (nội dung biến toàn cầu và địa phương, thông số ..). Tôi có thể dễ dàng tìm ra (các) trang để đổ, nhưng tiếc là không có cách nào để chỉ định một "dump-các trang" cho các bãi lõi bình thường (trừ khi bạn sẵn sàng để đi và vá các chức năng maydump() trong hạt nhân).

Còn bây giờ, tôi khá hài lòng với có 2 giải pháp (nó là tốt hơn so với không có gì ..) di chuyển tiếp theo của tôi sẽ là:

  • thấy khó khăn như thế nào sẽ đến cảng Breakpad để powerpc-linux: đã có powerpc-darwin và i386-linux như vậy .. làm thế nào cứng nó có thể được? :)
  • cố gắng sử dụng google-coredumper để chỉ đổ một vài trang quanh ESP hiện tại (nên cung cấp cho tôi người dân địa phương và thông số) và xung quanh "& some_global" (điều đó sẽ cho tôi hình cầu).
+0

Trong khi nó sẽ được đơn giản để ngã ba google-coredumper và sửa đổi các 'WriteCoreDump' chức năng để đổ các trang/địa chỉ cụ thể .. nó không có hỗ trợ cho powerpc: ( –

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