2012-10-06 24 views
7

Tôi đang sử dụng Ubuntu 12.04 LTS. Tôi đã viết một chương trình đơn giản như sau để tạo ra vụ tai nạnKhông thể tạo tệp lõi cho chương trình đã bị lỗi của tôi

// null.c 
#include<stdio.h> 

int main() 
{ 
    int *p = NULL; 
    int k=*p; 
    printf("%d",sizeof(0)); 
    return 0; 
} 

Bây giờ tôi chạy với "gcc -g null.c" và sau đó "./a.out" và đầu ra được như mong đợi.

Segmentation fault (core dumped) 

Bây giờ tôi muốn xem tệp kết xuất lõi bằng gdb. Tôi đã làm những điều sau đây

  1. Tôi đã kiểm tra thư mục hiện hành, không có lõi bãi tập
  2. tôi đã cố gắng cố gắng để thay đổi/proc/sys/kernel/core_pattern với nội dung "cốt lõi.% E.% p ". Nhưng tôi không thể viết vào tập tin. Nó đang nói "Fsync thất bại".
  3. Tôi đã sử dụng "sudo vi/proc/sys/kernel/core_pattern". Vẫn không thể ghi vào tệp.

Tôi muốn tạo phân đoạn lõi trong thư mục hiện tại của mình. Làm gì bây giờ?

Trả lời

19

Câu hỏi thực sự của bạn dường như không phải là "vùng chứa cốt lõi của tôi", mà là "cách tôi có thể sửa đổi /proc/sys/kernel/core_pattern".

sudo bash -c 'echo core.%e.%p > /proc/sys/kernel/core_pattern' 

nên thực hiện thủ thuật.

+0

Nó hoạt động ... Cảm ơn :) –

4

Bạn cần phải điều chỉnh giới hạn kích thước bãi chứa lõi của bạn với lệnh sau:

ulimit -S -c tối đa lõi-dump-kích thước

Các giá trị được đưa ra trong Kb .

+0

Tôi đã đặt. Nhưng làm thế nào tôi có thể chỉnh sửa các tập tin core_pattern? –

2

bạn không cần sử dụng mẫu lõi. nó chỉ bãi ở chỗ định dạng% e.% p

những gì bạn cần làm là #ulimit -c không giới hạn

và kiểm tra #ulimit -a

và xác nhận nếu kích thước tập tin lõi được thiết lập đúng cách. Bạn sẽ nhận được cốt lõi như core.pid sau đó.

1

Sự hiểu biết của tôi là sử dụng ulimit không phải là vĩnh viễn, tức là nếu bạn khởi động lại thì giới hạn quay lại 0. Để có vĩnh viễn vĩnh viễn, bạn cần thay đổi /etc/security/limits.conf. Tương tự cho mẫu lõi vv, thay đổi /etc/sysctl.conf.