หลักทิ้งแล้ว แต่ไฟล์หลักไม่ได้อยู่ในไดเรกทอรีปัจจุบัน?


277

ในขณะที่รันโปรแกรม C มันบอกว่า"(core dumped)"แต่ฉันไม่เห็นไฟล์ใด ๆ ภายใต้พา ธ ปัจจุบัน

ฉันได้ตั้งค่าและตรวจสอบulimit:

ulimit -c unlimited 
ulimit -a 

ฉันพยายามค้นหาไฟล์ชื่อ "core" แต่ไม่ได้รับไฟล์ทิ้งหลัก?
ความช่วยเหลือใด ๆ ไฟล์หลักของฉันอยู่ที่ไหน


1
โปรแกรมเรียกใช้ chdir บ้างไหม? ถ้าเป็นเช่นนั้นดูที่นั่น
วิลเลียม Pursell

2
โปรแกรมเปลี่ยนไดเรกทอรีทำงานหรือไม่? ดูนั่นสิ
Richard Pennington

ฉันจะค้นหา
ฮาร์ดไดรฟ์

1
อ๊ะไม่มีมันไม่มี ... ฉันตรวจสอบมัน .. โปรแกรม chdir ไปที่ / mnt และ / ฉันตรวจสอบทั้งสองไดเรกทอรี แต่ไม่สามารถหาไฟล์ได้ ฉันยังพบ / -name "* core" ด้วย แม้นี่จะไม่แสดงไฟล์ให้ฉัน โปรแกรมใช้ C + sqlite ในขณะที่ใส่ค่ามันทิ้งหลักมันกล่าวว่าข้อผิดพลาดการยืนยัน == 0 เป็นครั้งแรกและข้อผิดพลาด = 101 เป็นครั้งที่สอง ..
webminal.org

8
ใช่ถ้าคุณแทนที่/proc/sys/kernel/core_patternด้วยสตริงที่ขึ้นต้นด้วย/tmpนั่นคือที่ทิ้งขยะหลักของคุณ
ephemient

คำตอบ:


240

อ่าน/usr/src/linux/Documentation/sysctl/kernel.txt

[/ proc / sys / kernel /] core_pattern ใช้เพื่อระบุชื่อรูปแบบ core dumpfile

  • หากอักขระตัวแรกของรูปแบบคือ '|' เคอร์เนลจะถือว่าส่วนที่เหลือของรูปแบบเป็นคำสั่งให้เรียกใช้ ดัมพ์หลักจะถูกเขียนไปยังอินพุตมาตรฐานของโปรแกรมนั้นแทนไปยังไฟล์

แทนที่จะเขียนการถ่ายโอนข้อมูลหลักไปยังดิสก์ระบบของคุณได้รับการกำหนดค่าให้ส่งไปยังabrtโปรแกรมแทน เครื่องมือรายงานข้อผิดพลาดอัตโนมัติอาจไม่ได้รับการจัดทำเป็นเอกสารตามที่ควรเป็น ...

ไม่ว่าในกรณีใดคำตอบอย่างรวดเร็วคือคุณควรจะสามารถค้นหาไฟล์หลักของคุณได้/var/cache/abrtโดยที่abrtจะเก็บไฟล์ไว้หลังจากถูกเรียก ในทำนองเดียวกันระบบอื่น ๆ ที่ใช้Apportอาจกระรอกแกนกลางออกไป/var/crashและอื่น ๆ


30
ใช่ฉันได้แก้ไข core_pattern ด้วยการติดตามเนื้อหา echo "core.% e.% p"> / proc / sys / kernel / core_pattern .. ตอนนี้มันสร้างไฟล์ core dump ในไดเรกทอรีปัจจุบันเอง ด้วยชื่อ "core.giis.12344" ฯลฯ ขอบคุณทุกท่านสำหรับคำตอบ / ความคิดเห็น / คำแนะนำ
webminal.org

20
เพียงเพื่อให้ทราบว่าโปรแกรม fedora 18 abrt กำลังเก็บขยะทิ้งหลัก/var/spool/abrt/แทนที่จะเป็น/var/cache/abrt
Nelson

4
มีวิธีให้ผู้ใช้กำหนดค่านี้ด้วยตนเองแทนที่จะทุกคนต้องใช้การกำหนดค่าระบบหรือไม่
allyourcode

เมื่อคำสั่งนี้ถูกเรียกใช้และกระบวนการถูกเรียกใช้ stdout และ stderr จะไม่ถูกเปิดโดยค่าเริ่มต้น ฉันเห็นสิ่งแปลก ๆ เกิดขึ้น เมื่อฉันใช้ dup2 ของ stderr และ stdout ลงในไฟล์ที่กำหนดเองของฉัน (applog.txt) ข้อมูลที่ฉันกำลังเขียนลงในไฟล์อื่น (mycore.BIN) กำลังถูกเปลี่ยนเส้นทางไปยังไฟล์ที่ฉันใช้เพื่อจับ stdout & stderr (applog.txt) . มีการอ่านที่ดีเกี่ยวกับอันนี้หรือไม่? กรุณาแนะนำ ขอบคุณ
mk ..

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

224

ใน Ubuntu ล่าสุด (12.04 ในกรณีของฉัน) เป็นไปได้ที่จะพิมพ์ "Segmentation fault (core dumped)" แต่ไม่มีไฟล์หลักที่คุณอาจคาดหวัง (ตัวอย่างเช่นสำหรับโปรแกรมที่คอมไพล์ในเครื่อง)

สิ่งนี้อาจเกิดขึ้นหากคุณมีขนาดไฟล์หลักเป็น ulimit เป็น 0 (คุณยังไม่ได้ทำulimit -c unlimited) - นี่เป็นค่าเริ่มต้นบน Ubuntu โดยปกติแล้วจะระงับ "(core dumped)" ซึ่งทำให้คุณเข้าใจผิด แต่ใน Ubuntu นั้น corefiles จะถูกส่งไปยังApport (ระบบรายงานความผิดพลาดของ Ubuntu) ผ่านทาง/proc/sys/kernel/core_patternและดูเหมือนว่าจะทำให้เกิดข้อความที่ทำให้เข้าใจผิด

หาก Apport พบว่าโปรแกรมที่เป็นปัญหาไม่ใช่โปรแกรมที่ควรรายงานข้อขัดข้องสำหรับ (ซึ่งคุณสามารถเห็นได้เกิดขึ้น/var/log/apport.log) มันจะกลับไปจำลองพฤติกรรมการทำงานของเคอร์เนลเริ่มต้นของการวางไฟล์คอร์ใน cwd (จะทำในสคริปต์/usr/share/apport/apport) ซึ่งรวมถึงการให้เกียรติ ulimit ซึ่งในกรณีนี้มันไม่ทำอะไรเลย แต่ (ฉันถือว่า) ตราบใดที่เคอร์เนลเกี่ยวข้อง corefile ถูกสร้างขึ้น (และ piped เพื่อ apport) ดังนั้นข้อความ "Segmentation fault (core dumped)"

ในที่สุด PEBKAC ที่ลืมตั้ง ulimit แต่ข้อความที่ทำให้เข้าใจผิดทำให้ฉันคิดว่าฉันกำลังจะโมโหชั่วขณะหนึ่งสงสัยว่าสิ่งที่กิน corefiles ของฉัน

(โดยทั่วไปแล้วหน้า core (5) manual - man 5 core- เป็นการอ้างอิงที่ดีว่าไฟล์หลักของคุณสิ้นสุดที่ใดและสาเหตุที่อาจไม่ถูกเขียน)


4
ขอบคุณมาก - ฉันพบปัญหาเดียวกันมาก Btw, Ubuntu 14.04 แสดงพฤติกรรมเหมือนกับที่คุณอธิบาย
Malte Skoruppa

5
บน Ubuntu ติดตั้งของฉัน (แก้ไข 14.04) มีการแก้ปัญหาชั่วคราวง่ายสำหรับการนี้โดยการทำงานsudo service apport stop--- หลังจากที่ผมวิ่งว่ามันก็เปลี่ยน/proc/sys/kernel/core_patternจากท่อ Apport coreเพียงแค่ Apport ฉลาดพอที่จะแก้ไขปัญหาcore_patternชั่วคราวได้ฉันคิดว่า
Patrick Collins

6
"ulimit -c unlimited" เป็นสิ่งที่ฉันต้องการ - ขอบคุณ!
เดฟ C

4
ฉันได้ลองทุกคำตอบที่ใช้ได้และทุกตำแหน่งในทุกความคิดเห็นที่นี่หลังจากทำคำสั่ง ulimit แต่ยังไม่สามารถหาไฟล์หลักที่ใดก็ได้บน Ubuntu 16.04 LTS ของฉัน ...
Nagev

2
@ElectricGoat ไม่ฉันยังไม่ได้ มันออกแบบ UX ไม่ดี IMO ระบบควรพิมพ์เส้นทางหรือไม่พิมพ์ข้อความเลยหากยังไม่ได้สร้าง ฉันจะเพิ่มคำตอบของฉันเองเมื่อไหร่หรือถ้าฉันมีโอกาสตรวจสอบเพิ่มเติม
Nagev

80

ด้วยการเปิดตัวsystemdมีสถานการณ์อื่นเช่นกัน โดยค่าเริ่มต้น systemd จะเก็บการถ่ายโอนข้อมูลหลักในเจอร์นัลซึ่งสามารถเข้าถึงได้ด้วยsystemd-coredumpctlคำสั่ง กำหนดไว้ในไฟล์ core_pattern-:

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

พฤติกรรมนี้สามารถปิดการใช้งานด้วย "แฮ็ค" แบบง่าย:

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

ulimit -c unlimitedและเช่นเคยขนาดของแกนทิ้งจะต้องเท่ากับหรือสูงกว่าขนาดของแกนที่ถูกทิ้งเป็นกระทำโดยยกตัวอย่างเช่น


"แฮ็ค" นั้นใช้งานไม่ได้สำหรับฉัน (แม้หลังจากรีสตาร์ท) ฉันทำงาน Arch Linux ulimit -c unlimitedและผมเคยทำงานอยู่แล้ว
gsingh2011

@ gsingh2011 มันอาจจะล้าสมัย ฉันไม่เรียกใช้ Arch อีกต่อไปดังนั้นฉันไม่สามารถพูดได้ว่าควรจะทำงานได้ในวันนี้หรือไม่ หากคุณคิดออกโปรดอัปเดตฉัน / เราด้วยความคิดเห็นใหม่
timss

5
@ gsingh2011 ลองแทน50-coredump.conf นี้ควรแทนที่coredump.conf /lib/sysctl.d/50-coredump.confค่าเริ่มต้นสามารถเรียกคืนได้ด้วยsysctl -w kernel.core_pattern=core
Lekensteyn

ฉันต้องปิด appport เพื่อให้ทำงานได้sudo service apport stop
rahul003

51

การเขียนคำแนะนำเพื่อรับการถ่ายโอนข้อมูลหลักภายใต้Ubuntu 16.04 LTS :

  1. ตามที่ @ jtn ได้กล่าวถึงในคำตอบของเขา Ubuntu ได้มอบหมายการแสดงผลของความขัดข้องให้กับapportซึ่งในทางกลับกันปฏิเสธที่จะเขียนการถ่ายโอนข้อมูลเนื่องจากโปรแกรมไม่ใช่แพ็คเกจที่ติดตั้งก่อนทำการเปลี่ยนแปลง

  2. ในการแก้ไขปัญหาเราต้องแน่ใจว่าapportเขียนไฟล์ core dump สำหรับโปรแกรมที่ไม่ใช่แพ็คเกจด้วย หากต้องการทำเช่นนั้นให้สร้างไฟล์ชื่อ~ / .config / apport / settingsด้วยเนื้อหาต่อไปนี้:
    [main] unpackaged=true

  3. ตอนนี้ความผิดพลาดของโปรแกรมของคุณอีกครั้งและดูไฟล์ที่ผิดพลาดของคุณจะถูกสร้างขึ้นภายในโฟลเดอร์: / var / ความผิดพลาดที่มีชื่อเหมือน.1000.crash * โปรดทราบว่าgdbไม่สามารถอ่านไฟล์เหล่านี้โดยตรงหลังจากทำการเปลี่ยนแปลง
  4. [ไม่บังคับ]หากต้องการทำให้ dumps readble โดย gdb ให้รันคำสั่งต่อไปนี้:

    apport-unpack <location_of_report> <target_directory>

ข้อมูลอ้างอิง: Core_dump - Oracle VM VirtualBox


3
นี่เป็นทางออกเดียวที่ใช้ได้กับฉันใน Ubuntu 18.04
greuze

ผู้ใช้คนไหนที่ ~ / เกี่ยวข้องกับ? หากกระบวนการทำงานโดยรูทหมายความว่า /root/.config/apport/settings หรือไม่
Nicholi

@ Nicholi ฉันเชื่อว่ามันควรจะเป็นผู้ใช้ที่รันโปรแกรม ฉันไม่แน่ใจ
ankurrc

12

ฉันนึกถึงความเป็นไปได้สองอย่างต่อไปนี้:

  1. chdir()เป็นคนอื่นได้ชี้แล้วออกจากโปรแกรมที่อาจจะ ผู้ใช้ที่ใช้งานโปรแกรมได้รับอนุญาตให้เขียนลงในไดเรกทอรีchdir()หรือไม่ มิฉะนั้นจะไม่สามารถสร้างคอร์ดัมพ์ได้

  2. ด้วยเหตุผลแปลก ๆ บางอย่างดัมพ์หลักไม่มีชื่อcore.*คุณสามารถตรวจสอบ/proc/sys/kernel/core_patternได้ นอกจากนี้คำสั่ง find ที่คุณตั้งชื่อจะไม่พบ core dump ทั่วไป คุณควรใช้find / -name "*core.*"เนื่องจากชื่อทั่วไปของ coredump คือcore.$PID


นี่คือรูปแบบของฉัน - นี่หมายความว่าไฟล์หลักชื่ออะไรบางอย่างเช่น "PID.signal.userid" แทนที่จะเป็น core.pid ??? $ cat / proc / sys / kernel / core_pattern / usr / lib / hookCCpp / var / char / abrt% p% s% u
webminal.org

9

หากคุณไม่มีแกนทิ้งสำหรับไบนารีRHELและเมื่อใช้abrtตรวจสอบให้แน่ใจว่า/etc/abrt/abrt-action-save-package-data.conf

มี

ProcessUnpackaged = yes

สิ่งนี้ช่วยให้สามารถสร้างรายงานข้อขัดข้อง (รวมถึงการถ่ายโอนข้อมูลหลัก) สำหรับไบนารีที่ไม่ได้เป็นส่วนหนึ่งของแพ็คเกจที่ติดตั้ง (เช่นสร้างขึ้นภายในเครื่อง)


6

สำหรับ fedora25 ฉันสามารถหาไฟล์หลักได้ที่

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

ที่ไหนccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %ตาม `/ proc / sys / kernel / core_pattern '


5

ความพยายามของฉันใน WSL ไม่ประสบความสำเร็จ

สำหรับผู้ที่ทำงานบน Windows Subsystem สำหรับ Linux (WSL) ดูเหมือนว่าจะเป็นปัญหาที่เปิดอยู่ในเวลานี้สำหรับไฟล์ดัมพ์หลักที่ขาดหายไป

ความคิดเห็นระบุว่า

นี่เป็นปัญหาที่ทราบกันดีว่าเราตระหนักถึงมันเป็นสิ่งที่เรากำลังสืบสวนอยู่

ปัญหา Github

คำติชมของนักพัฒนา Windows


5

ใน Ubuntu18.04 วิธีที่ง่ายที่สุดในการรับไฟล์หลักคือการป้อนคำสั่งด้านล่างเพื่อหยุดบริการ apport

sudo service apport stop

จากนั้นรันแอปพลิเคชันอีกครั้งคุณจะได้รับไฟล์ดัมพ์ในไดเรกทอรีปัจจุบัน


3

ฉันใช้ Linux Mint 19 (ใช้ Ubuntu 18) ฉันต้องการมีcoredumpไฟล์ในโฟลเดอร์ปัจจุบัน ฉันต้องทำสองสิ่ง:

  1. เปลี่ยน/proc/sys/kernel/core_pattern(โดย# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_patternหรือโดย# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
  2. เพิ่มขีด จำกัด สำหรับขนาดไฟล์หลักโดย $ ulimit -c unlimited

นั่นเขียนไว้ในคำตอบแล้ว แต่ฉันเขียนเพื่อสรุปรวบรัด ขีด จำกัด การเปลี่ยนแปลงที่น่าสนใจไม่จำเป็นต้องมีสิทธิ์รูท (ตาม/ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user-ไม่ใช่/ubuntu/162229/howรูทสามารถลดขีด จำกัด ลงได้เท่านั้นดังนั้นจึงเป็นสิ่งที่ไม่คาดคิด - ความคิดเห็นเกี่ยวกับเรื่องนี้ยินดีต้อนรับ)


2

ulimit -c unlimited ทำไฟล์หลักอย่างถูกต้องปรากฏในไดเรกทอรีปัจจุบันหลังจาก "core ทิ้ง"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.