Core bị đổ, nhưng tập tin core không có trong thư mục hiện tại?


276

Trong khi chạy chương trình C, nó báo "(lõi bị đổ)" nhưng tôi không thể thấy bất kỳ tệp nào trong đường dẫn hiện tại.

Tôi đã thiết lập và xác minh ulimit:

ulimit -c unlimited 
ulimit -a 

Tôi cũng đã cố gắng tìm một tệp có tên là "lõi", nhưng không nhận được tệp bị đổ lõi?
Bất kỳ trợ giúp, tập tin cốt lõi của tôi ở đâu?


1
Chương trình có gọi chdir tại một số điểm không? Nếu vậy, hãy nhìn vào đó.
William Pursell

2
Chương trình có thay đổi thư mục làm việc không? Nhìn kia kìa.
Richard Pennington

Tôi sẽ tìm kiếm toàn bộ ổ cứng cho một tập tin gần đây;)
Hamish Grubijan

1
Rất tiếc không có nó ... Tôi đã kiểm tra nó .. chương trình chdir đến / mnt và / i đã kiểm tra cả hai thư mục nhưng không thể tìm thấy tệp. Tôi thậm chí đã tìm / -name "* core." ngay cả điều này đã không cho tôi xem các tập tin. Chương trình sử dụng C + sqlite, trong khi chèn các giá trị mà nó bỏ qua. Nó cho biết lỗi xác nhận == 0 lần đầu tiên và lỗi = 101 lần thứ hai ..
webminal.org

7
Có, nếu bạn ghi đè /proc/sys/kernel/core_patternbằng một chuỗi bắt đầu bằng /tmpthì đó là nơi các lõi của bạn sẽ đi.
ephemient

Câu trả lời:


240

Đọc /usr/src/linux/Documentation/sysctl/kernel.txt .

[/ Proc / sys / kernel /] core_potype được sử dụng để chỉ định tên mẫu dumpfile lõi.

  • Nếu ký tự đầu tiên của mẫu là '|', hạt nhân sẽ coi phần còn lại của mẫu là lệnh để chạy. Kết xuất lõi sẽ được ghi vào đầu vào tiêu chuẩn của chương trình đó thay vì vào một tệp.

Thay vì ghi kết xuất lõi vào đĩa, hệ thống của bạn được cấu hình để gửi nó đến abrtchương trình thay thế. Bug tự động Reporting Tool được có thể không phải là tài liệu như nó nên được ...

Trong mọi trường hợp, câu trả lời nhanh là bạn sẽ có thể tìm thấy tệp cốt lõi của mình /var/cache/abrt, nơi abrtlưu trữ tệp đó sau khi được gọi. Tương tự, các hệ thống khác sử dụng Apport có thể thu gọn lõi /var/crash, v.v.


30
có, tôi đã chỉnh sửa core_potype với nội dung sau "core.% e.% p"> / Proc / sys / kernel / core_potype .. bây giờ nó tạo tệp kết xuất lõi trong chính thư mục hiện tại. với tên "core.giis.12344", vv Cảm ơn tất cả các câu trả lời / nhận xét / gợi ý của bạn.
webminal.org

20
Chỉ cần lưu ý rằng chương trình abrt fedora 18 đang lưu trữ các bãi rác cốt lõi /var/spool/abrt/thay vì/var/cache/abrt
Nelson

4
Có cách nào để cho phép người dùng tự cấu hình cái này thay vì mọi người phải sử dụng cấu hình hệ thống không?
mã đồng minh

Khi lệnh này được chạy và tiến trình được gọi, stdout và stderr không được mở theo mặc định? Tôi thấy những điều rất kỳ lạ xảy ra. Khi tôi sử dụng dup2 của stderr và stdout vào tệp tùy chỉnh của mình (applog.txt), Dữ liệu tôi đang ghi vào tệp khác (mycore.BIN) sẽ được chuyển hướng đến tệp mà tôi đã sử dụng để bắt stdout & stderr (applog.txt) . Có một đọc tốt về cái này? Xin đề nghị. Cảm ơn bạn
mk ..

20
systemd in archlinux store coredumps in/var/lib/systemd/coredump/
Francois

224

Trên Ubuntu gần đây (12.04 trong trường hợp của tôi), có thể in "Lỗi phân đoạn (bị đổ lõi)", nhưng không có tệp lõi nào được tạo ra ở nơi bạn có thể mong đợi (ví dụ: chương trình được biên dịch cục bộ).

Điều này có thể xảy ra nếu bạn có kích thước tệp lõi là 0 (bạn chưa hoàn thành ulimit -c unlimited) - đây là mặc định trên Ubuntu. Thông thường, điều đó sẽ triệt tiêu "(lõi bị bỏ)", khiến bạn mắc lỗi, nhưng trên Ubuntu, các tệp lõi được chuyển đến Apport (hệ thống báo cáo sự cố của Ubuntu) /proc/sys/kernel/core_patternvà điều này dường như gây ra thông báo sai lệch.

Nếu Apport phát hiện ra rằng chương trình đang được đề cập không phải là chương trình nên báo cáo sự cố cho (mà bạn có thể thấy xảy ra /var/log/apport.log), nó sẽ quay lại mô phỏng hành vi kernel mặc định của việc đặt tệp lõi vào cwd (điều này được thực hiện trong tập lệnh /usr/share/apport/apport). Điều này bao gồm tôn vinh ulimit, trong trường hợp đó nó không làm gì cả. Nhưng (tôi giả sử) khi có liên quan đến kernel, corefile đã được tạo (và được chuyển sang apport), do đó thông báo "Lỗi phân đoạn (lõi bị đổ)".

Cuối cùng PEBKAC vì quên đặt ulimit, nhưng tin nhắn gây hiểu lầm khiến tôi nghĩ rằng tôi sẽ phát điên trong một thời gian, tự hỏi những gì đã ăn lõi của tôi.

(Ngoài ra, nói chung, trang hướng dẫn lõi (5) - man 5 core- là một tài liệu tham khảo tốt về nơi tệp lõi của bạn kết thúc và lý do có thể không được viết.)


4
Cảm ơn bạn rất nhiều - Tôi gặp vấn đề tương tự. Btw, Ubuntu 14.04 thể hiện chính xác hành vi giống như hành vi bạn mô tả.
Malte Skoruppa

5
Trên bản cài đặt Ubuntu của tôi (đã sửa đổi 14.04), có một cách giải quyết tạm thời dễ dàng cho việc này bằng cách chạy sudo service apport stop--- sau khi tôi chạy nó, nó đã thay đổi /proc/sys/kernel/core_patterntừ đường ống apport thành chỉ core. Apport đủ thông minh để khắc phục core_patterntạm thời, tôi cho rằng.
Patrick Collins

6
"ulimit -c không giới hạn" chính xác là những gì tôi cần - Cảm ơn bạn!
Dave C

4
Tôi đã thử mọi câu trả lời phù hợp và mọi vị trí trong mọi bình luận ở đây sau khi thực hiện lệnh ulimit, nhưng vẫn không thể tìm thấy tệp lõi ở bất kỳ đâu trên Ubuntu 16.04 LTS của tôi ...
Nagev

2
@ElectricGoat Không tôi không có. Đó là thiết kế UX kém, IMO. Hệ thống chỉ nên in đường dẫn hoặc hoàn toàn không in một tin nhắn nếu nó không được tạo. Tôi sẽ thêm câu trả lời của riêng mình, khi nào hoặc nếu tôi có cơ hội điều tra thêm.
Nagev

80

Với sự ra mắt của systemd , có một kịch bản khác nữa. Theo mặc định systemd sẽ lưu trữ các kết xuất lõi trong nhật ký của nó, có thể truy cập bằng systemd-coredumpctllệnh. Được xác định trong tệp core_potype:

$ cat /proc/sys/kernel/core_pattern 
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e

Hành vi này có thể bị vô hiệu hóa bằng một "hack" đơn giản:

$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core      # or just reboot

Như mọi khi, kích thước của các bãi lõi phải bằng hoặc cao hơn kích thước của lõi được đổ, như được thực hiện chẳng hạn ulimit -c unlimited.


"Hack" đó không hoạt động với tôi (ngay cả sau khi khởi động lại). Tôi đang chạy Arch Linux và tôi đã chạy ulimit -c unlimited.
gsingh2011

@ gsingh2011 Nó có thể bị lỗi thời. Tôi không chạy Arch nữa vì vậy tôi không thể nói nếu nó hoạt động vào những ngày này. Nếu bạn nhận ra, hãy cập nhật cho tôi / chúng tôi một bình luận mới.
timss

5
@ gsingh2011 Hãy thử 50-coredump.confthay vì coredump.conf. Điều này sẽ ghi đè /lib/sysctl.d/50-coredump.conf. Mặc định có thể được khôi phục vớisysctl -w kernel.core_pattern=core
Lekensteyn

Tôi đã phải tắt appport để nó hoạt độngsudo service apport stop
rahul003

51

Viết hướng dẫn để có được kết xuất lõi trong Ubuntu 16.04 LTS :

  1. Như @jtn đã đề cập trong câu trả lời của mình, Ubuntu ủy quyền hiển thị các sự cố cho apport , do đó từ chối viết kết xuất vì chương trình không phải là gói đã cài đặt.Trước khi thay đổi

  2. Để khắc phục sự cố, chúng tôi cần đảm bảo apport ghi các tệp kết xuất lõi cho các chương trình không phải là gói . Để làm như vậy, hãy tạo một tệp có tên ~ / .config / apport / settings với các nội dung sau:
    [main] unpackaged=true

  3. Bây giờ lại làm hỏng chương trình của bạn và xem các tệp sự cố của bạn được tạo trong thư mục: / var / crash với các tên như * .1000.crash . Lưu ý rằng các tệp này không thể được đọc bởi gdb trực tiếp.Sau khi thay đổi
  4. [Tùy chọn] Để làm cho các bãi chứa dễ đọc bằng gdb, hãy chạy lệnh sau:

    apport-unpack <location_of_report> <target_directory>

Tham khảo: Core_dump - Oracle VM VirtualBox


3
Đây là giải pháp duy nhất hiệu quả với tôi trong Ubuntu 18.04
greuze

Người dùng nào ~ / liên quan đến? Nếu tiến trình được chạy bởi root thì có nghĩa là /root/.config/apport/sinstall?
Nicholi

@Nicholi Tôi tin rằng nó nên là người dùng thực hiện chương trình. Tôi không chắc chắn mặc dù.
ankurrc

12

Tôi có thể nghĩ về hai khả năng sau đây:

  1. Như những người khác đã chỉ ra, chương trình có thể chdir(). Người dùng đang chạy chương trình có được phép ghi vào thư mục mà nó chdir()phù hợp không? Nếu không, nó không thể tạo ra bãi chứa lõi.

  2. Vì một số lý do kỳ lạ, bãi chứa lõi không có tên core.*Bạn có thể kiểm tra xem /proc/sys/kernel/core_pattern. Ngoài ra, lệnh find bạn đặt tên sẽ không tìm thấy kết xuất lõi điển hình. Bạn nên sử dụng find / -name "*core.*", vì tên điển hình của coredump làcore.$PID


đây là mẫu của tôi - điều này có nghĩa là tệp lõi được đặt tên giống như "PID.signal.userid" thay vì core.pid ??? $ cat / Proc / sys / kernel / core_potype / usr / lib / hookCCpp / var / char / abrt% p% s% u
webminal.org

9

Nếu bạn thiếu các bãi chứa lõi cho nhị phân trên RHELvà khi sử dụng abrt, hãy đảm bảo rằng/etc/abrt/abrt-action-save-package-data.conf

chứa đựng

ProcessUnpackaged = yes

Điều này cho phép tạo các báo cáo sự cố (bao gồm các bãi chứa lõi) cho các nhị phân không phải là một phần của các gói đã cài đặt (ví dụ: được xây dựng cục bộ).


6

Đối với fedora25, tôi có thể tìm thấy tệp lõi tại

/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump

nơi ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %theo `/ proc / sys / kernel / core_pattern'


5

Những nỗ lực của tôi trong WSL đã không thành công.

Đối với những người chạy trên Hệ thống con Windows cho Linux (WSL) dường như có một vấn đề mở tại thời điểm này đối với các tệp kết xuất lõi bị thiếu.

Các ý kiến ​​chỉ ra rằng

Đây là một vấn đề được biết đến mà chúng tôi nhận thức được, nó là một cái gì đó chúng tôi đang điều tra.

Vấn đề Github

Phản hồi của nhà phát triển Windows


5

Trong Ubuntu18.04, cách dễ nhất để lấy tệp lõi là nhập lệnh bên dưới để dừng dịch vụ apport.

sudo service apport stop

Sau đó chạy lại ứng dụng, bạn sẽ nhận được tệp kết xuất trong thư mục hiện tại.


3

Tôi đang dùng Linux Mint 19 (dựa trên Ubuntu 18). Tôi muốn có coredumptập tin trong thư mục hiện tại. Tôi đã phải làm hai điều:

  1. Thay đổi /proc/sys/kernel/core_pattern(bởi # echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_patternhoặc bởi# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
  2. Tăng giới hạn cho kích thước tệp lõi bằng $ ulimit -c unlimited

Điều đó đã được viết sẵn trong các câu trả lời, nhưng tôi đã viết để tóm tắt ngắn gọn. Giới hạn thay đổi thú vị không yêu cầu quyền root (theo https://askubfox.com/questions/162229/how-do-i-increas-the-open-files-limit-for-a-non-root-user non- root chỉ có thể hạ thấp giới hạn, vì vậy thật bất ngờ - ý kiến ​​về nó được chào đón).


2

ulimit -c unlimited làm cho tập tin lõi xuất hiện chính xác trong thư mục hiện tại sau khi "lõi bị đổ".

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.