คำถามติดแท็ก segmentation-fault

4
Segmentation Fault ทำงานอย่างไรภายใต้ประทุน?
ฉันไม่สามารถหาข้อมูลใด ๆ นอกเหนือไปจาก "MMU ของ CPU ส่งสัญญาณ" และ "เคอร์เนลนำมันไปยังโปรแกรมที่ละเมิดทำให้ยุติ" "Segmentation fault"ฉันคิดว่ามันอาจจะส่งสัญญาณไปยังเปลือกและเปลือกจัดการกับมันโดยยกเลิกกระบวนการที่กระทำผิดและการพิมพ์ ดังนั้นฉันทดสอบสมมติฐานโดยการเขียนเชลล์ที่น้อยที่สุดที่ฉันเรียกว่าcrsh (crap shell) เชลล์นี้ไม่ได้ทำอะไรเลยนอกจากเอาข้อมูลผู้ใช้และป้อนไปยังsystem()วิธีการ #include <stdio.h> #include <stdlib.h> int main(){ char cmdbuf[1000]; while (1){ printf("Crap Shell> "); fgets(cmdbuf, 1000, stdin); system(cmdbuf); } } ดังนั้นฉันจึงวิ่งเปลือกนี้ใน terminal เปลือย (โดยไม่ต้องbashวิ่งภายใต้) จากนั้นฉันก็ดำเนินการเรียกใช้โปรแกรมที่สร้าง segfault หากสมมติฐานของฉันถูกต้องสิ่งนี้อาจจะเป็น) ความผิดพลาดcrshปิด xterm, b) ไม่พิมพ์"Segmentation fault"หรือ c) ทั้งสองอย่าง braden@system ~/code/crsh/ …

2
Linux จะเริ่มฆ่ากระบวนการของฉันโดยไม่ถามฉันหรือไม่ว่าหน่วยความจำสั้น
ฉันใช้เชลล์สคริปต์พร้อมคำสั่งเพื่อรันโปรแกรมที่ใช้หน่วยความจำมาก (2-5 GB) กลับไปด้านหลัง เมื่อฉันกลับไปตรวจสอบความคืบหน้าของสคริปต์ของฉันฉันรู้สึกประหลาดใจที่พบว่ากระบวนการบางอย่างของฉันเป็นKilledไปตามที่สถานีของฉันรายงานให้ฉัน มีหลายโปรแกรมที่ทำเสร็จแล้วอย่างต่อเนื่องก่อนที่โปรแกรมที่จะKilledเริ่มในภายหลังแต่โปรแกรมทั้งหมดหลังจากนั้นล้มเหลวในการแบ่งส่วนความผิดพลาด (ซึ่งอาจหรืออาจไม่ได้เกิดจากข้อผิดพลาดในรหัสของฉันอ่านต่อไป) ฉันดูประวัติการใช้งานของคลัสเตอร์เฉพาะที่ฉันใช้และเห็นว่ามีคนเริ่มใช้กระบวนการที่ใช้หน่วยความจำจำนวนมากในเวลาเดียวกันและในการทำเช่นนั้นทำให้หน่วยความจำจริงหมดลง (และอาจเป็นพื้นที่ swap) ในคลัสเตอร์ ดีที่สุดเท่าที่ฉันจะเข้าใจได้กระบวนการที่ใช้หน่วยความจำมากเหล่านี้เริ่มทำงานในเวลาเดียวกับที่ฉันเริ่มมีปัญหากับโปรแกรมของฉัน เป็นไปได้ไหมที่ลีนุกซ์ฆ่าโปรแกรมของฉันเมื่อหน่วยความจำไม่เพียงพอ? และเป็นไปได้ไหมที่การแบ่งส่วนที่ผิดพลาดที่ฉันได้รับในภายหลังนั้นเกิดจากการขาดหน่วยความจำที่พร้อมใช้งานเพื่อเรียกใช้โปรแกรมของฉัน (แทนที่จะเป็นจุดบกพร่องในรหัสของฉัน)?

2
การเรียกใช้แอปพลิเคชันลงท้ายด้วย“ Segmentation Fault”
ฉันมีแอปพลิเคชันบรรทัดคำสั่งที่เมื่อรันไม่ได้ทำในสิ่งที่ควรทำและ ณ จุดหนึ่งออกจากข้อความ: Segmentation fault สิ่งนี้หมายความว่า? ฉันควรทำอย่างไร?

4
การแบ่งส่วนความผิดพลาด (แกนทิ้ง) - ไปที่ไหน? มันคืออะไร? และทำไม?
เมื่อเกิดข้อผิดพลาดในการแบ่งส่วนใน Linux ข้อความแสดงข้อผิดพลาดSegmentation fault (core dumped)จะถูกพิมพ์ไปยังเทอร์มินัล (ถ้ามี) และโปรแกรมจะถูกยกเลิก ในฐานะ C / C ++ dev สิ่งนี้เกิดขึ้นกับฉันบ่อยครั้งและฉันมักจะเพิกเฉยต่อมันและไปยังgdbสร้างการกระทำก่อนหน้าของฉันใหม่เพื่อกระตุ้นการอ้างอิงหน่วยความจำที่ไม่ถูกต้องอีกครั้ง ฉันคิดว่าฉันอาจสามารถใช้ "แกนหลัก" นี้แทนได้เนื่องจากการรันgdbตลอดเวลานั้นค่อนข้างน่าเบื่อและฉันไม่สามารถสร้างข้อผิดพลาดในการแบ่งกลุ่มได้อีก คำถามของฉันคือสาม: ทิ้ง "แกนกลาง" นี้ไว้ที่ไหน มันมีอะไรบ้าง ฉันจะทำอย่างไรกับมัน?

2
Piping output จากโปรแกรม segfaulting
ฉันมีสคริปต์ที่เรียกใช้โปรแกรม (โดยเฉพาะttf2afmส่วนหนึ่งของ tetex 3.0) ซึ่งบางครั้ง segfaults และบางครั้งก็ไม่มี ข้อมูลที่ฉันต้องการจะพิมพ์ออกมาเสมอก่อนที่จะแยก segfaults แต่ฉันประสบปัญหาในการหยุดการเปลี่ยนเส้นทางไปป์จากความล้มเหลวและไม่ส่งออกข้อมูลใด ๆ ไปยังไพพ์เมื่อโปรแกรมล้มเหลว ฉันได้ลองเปลี่ยนเส้นทางผ่าน FIFO วงเล็บกระบวนการด้วยtrueตอนท้ายเรียกใช้จากฟังก์ชั่นเชลล์และการเข้ารหัสsh -cแต่ดูเหมือนว่าสคริปต์จะไม่ยอมให้กระบวนการส่งผลอะไรออกไป ฉันรู้ว่ามันมีความสามารถในการส่งออกเนื่องจากมันสามารถให้ได้อย่างสมบูรณ์จากบรรทัดคำสั่ง แต่ไม่ใช่จากสคริปต์ด้วยเหตุผลบางอย่าง คำถามของฉันคือมีวิธีใดบ้างที่สคริปต์จะเพิกเฉยต่อความจริงที่ว่าโปรแกรม segfaults และให้ผลลัพธ์กับฉันหรือไม่ ฉันใช้ BASH 4.1.10 (2) - ปล่อย

2
ฉันจะดักโปรแกรมที่คืนค่า 139 (การแบ่งเซกเมนต์ผิดพลาด) ใน bash ได้อย่างไร?
ฉันมีสคริปต์ทุบตีที่ทดสอบโปรแกรมบางโปรแกรมและหนึ่งในโปรแกรมส่งคืนSegmentation faultดังนั้นฉันจึงพยายามเพิ่มกับดักไว้ในหัวสคริปต์ของฉัน: trap "echo 'segfault occured!'" SIGSEGV อย่างไรก็ตามไม่ได้ทำอะไรเลย ฉันใช้ echo $? หลังจากโปรแกรมที่สร้าง segfault และฉันได้รับ139เป็นผลลัพธ์ ฉันจะเพิ่มกับดักสำหรับรหัสข้อผิดพลาดเฉพาะนั้นได้อย่างไร

2
.dtors ดูเขียนได้ แต่พยายามเขียน segfault
นี่คือ Ubuntu 9.04, 2.6.28-11-server, 32bit x86 $ cat test.c main() { int *dt = (int *)0x08049f18; *dt = 1; } $ readelf -S ./test ... [18] .dtors PROGBITS 08049f14 000f14 000008 00 WA 0 0 4 ... $ ./test Segmentation fault $ สำหรับมือใหม่: gcc สร้างเซ็กเมนต์ destructor .dtors, ใน elf executable, …

1
การแบ่งกลุ่มผิดพลาดเมื่อพยายามเรียกใช้ glxgears ผ่าน virtualGL
(ติดตามผลการใช้ 3D อย่างมีประสิทธิภาพผ่านการเชื่อมต่อระยะไกลได้อย่างไร ) ฉันติดตั้งแพ็คเกจ amd64 บนเซิร์ฟเวอร์และ i386 หนึ่งบนไคลเอนต์ ทำตามคำแนะนำของผู้ใช้ที่ฉันเรียกใช้บนไคลเอนต์: me@client> /opt/VirtualGL/bin/vglconnect me@server me@server> /opt/VirtualGL/bin/vglrun glxgears สิ่งนี้ทำให้เกิด segfault โดยใช้vglconnect -sสำหรับ ssh tunnel ไม่ทำงานเช่นกัน ฉันลองใช้วิธี TurboVNCซึ่งเป็นจุดเริ่มต้นvglrun glxgearsแต่ฉันต้องการส่งเฉพาะหน้าต่างแอปพลิเคชันที่ใช้การบีบอัด jpeg ปัญหาคือ 32 <-> 64 บิตใช่ไหม หรือฉันจะแก้ไขสิ่งต่าง ๆ ได้อย่างไร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.