Core dump อีกแล้ว!! คำพูดนี้เกิดขึ้นหลังจากที่เพื่อนคนหนึ่งได้โทรมาถามปัญหาเรื่องการใช้ rpm เสร็จ ตอนแรกก็งงๆ core dump คือไรหว่า มันขึ้น error ตรงไหน แล้วรู้ได้ไง ผมเลยลองค้นๆดูปรากฏว่าปัญหานี้เราเคยเจอแล้วนี้ เจอที่ blog ของเราเองด้วย แต่ตอนนั้นไม่ได้หาสาเหตุว่าเกิดจากอะไรกันแน่เพราะว่าไม่มีสิทธิแก้ไขอะไรมาก เพราะเราเช่าโฮสทฺ์เค้าไม่ใช่ของเราเอง

หลังจากลองดูรายละเอียดแล้วก็พบว่า การเกิด core dump ได้นั้นสาเหตุหลักๆคือ การทำงานผิดพลาดของโปรแกรม (program crash) หรือ อีกสาเหตุเกิดจากการที่ program พยายาม access memory ในส่วนที่ไม่ได้รับอนุญาต จึงทำให้ OS สั่งปิดโปรแกรม (Kill process) นั้นซะ จากเหตุการณ์ทั้งสอง OS ก็ได้สร้าง Core dump file ขึ้นมาเพื่อช่วยให้เหล่า programmer ทั้งหลายพบจุดผิดพลาดของโปรแกรม หรือ ช่วยในการ debug โปรแกรมนั้นเอง

ลักษณะของ core file นั้นสามารถสังเกตุได้ว่าไฟล์จะชื่อขึ้นต้นด้วยคำว่า core และตามด้วยจุดกับตัวเลข (ซึ่งก็คือ PID) เช่น core.20 เป็นต้น

เรามาดูกันว่าเราจะจัดการเจ้า core file ได้อย่างไรบ้างกันดีกว่า

ถ้าต้องการปิดไม่ให้มีการสร้าง core file ขึ้นมาให้ใช้คำสั่ง

[shell][root@ezylinux ~]# ulimit -S -c 0 > /dev/null 2>&1[/shell]

ถ้าต้องการเปิดให้มีการเขียน core file ได้ให้ใช้คำสั่ง

[shell][root@ezylinux ~]# ulimit -S -c 25000 > /dev/null 2>&1 //กำหนดให้ core file มีขนาดเท่ากับ 25,000 byte[/shell]
[shell][root@ezylinux ~]# ulimit -S -c unlimited > /dev/null 2>&1 //กำหนดให้ core file มีขนาดไม่จำกัด[/shell]

-c คือขนาดสูงสุดของ core file

หรือถ้าต้องการให้ใช้งานตลอดไปให้แก้ไขไฟล์ /etc/profile แล้วเพิ่มคำสั่งข้างต้นลงไป

เรายังสามารถกำหนด path ที่เก็บและชื่อของ core file ว่าจะขึ้นต้นว่าอะไรได้ด้วย ซึ่งก็ให้ใส่ค่า path และชื่อไฟล์ที่ต้องการไปในไฟล์ proc/sys/kernel/core_pattern โดยใช้คำสั่ง echo เช่น กำหนดให้ core file ไปถูกเขียนใน directory ที่ /path/corefile และชื่อ file ชื่อว่า core

[shell][root@ezylinux ~]# echo "/path/corefiles/core" > /proc/sys/kernel/core_pattern[/shell]

ด้านล่างนี้เป็น parameter ที่สามารถใช้ได้กับคำสั่งการแก้ไข core pattern

  • %% – A single % character
  • %p – PID of dumped process
  • %u – real UID of dumped process
  • %g – real GID of dumped process
  • %s – number of signal causing dump
  • %t – time of dump (secs since 0:00h, 1 Jan 1970)
  • %h – hostname (same as the ‘nodename’ returned by uname(2))
  • %e – executable filename

จากข้างต้นโดย default แล้วเวลาเกิดการเขียน core file จะมีการใส่เลข .PID เข้าไปหลังชื่อ core file เราสามารถกำหนดไม่ให้มีการใส่ .PID เข้าไปหลังจากระบบ dump core file ได้โดยใช้คำสั่ง

[shell][root@ezylinux ~]# echo "0" > /proc/sys/kernel/core_uses_pid[/shell]

สุดท้ายทดสอบการเซตค่าการสร้าง core file โดยใช้คำสั่ง

[shell][root@ezylinux ~]# kill -s SIGSEGV $$[/shell]