Category Archives: C

มันเกิดอะไรกับ malloc () ถึงได้ memory corruption

เรื่องราวมันสั้นๆไม่ยาวมากครับหลังจากที่ผมหัดเขียน ภาษา C บน Linux มา 10 เดือนได้  หลังจากทุกอย่างดูเรียบร้อยใน phase 1 โปรแกรมก็ได้ใช้งานจริงมาหลายเดือนแต่แล้ววันนึงเหตุการณ์ไม่คาดฝันก็คือโปรแกรมตายไปโดยทิ้งร่องรอยไว้ให้ผมแค่นี้

*** glibc detected *** xxx.out  : malloc(): memory corruption: 0x000000001eb64200 ***

#0 0x0000003500a30155 in raise () from /lib64/libc.so.6
#1 0x0000003500a31bf0 in abort () from /lib64/libc.so.6
#2 0x0000003500a6a38b in __libc_message () from /lib64/libc.so.6
#3 0x0000003500a71cd1 in _int_malloc () from /lib64/libc.so.6
#4 0x0000003500a72e8d in malloc () from /lib64/libc.so.6

อย่างที่ทุกคนทราบว่า malloc() ยังไงมันก็คงไม่ผิด ปัญหาก็ย้อนกลับมาที่คนเขียนว่าแล้วมันผิดที่ไหน นั่งหาอยู่เกือบวันเศษๆได้ข้อสรุปว่าอาการนี้เค้าเรียก memory leak ก็มานั่งไล่ในโปรแกรมนั้นว่าตรงไหนที่มันจะ leak (ประมาณ malloc() แล้วก็ไม่มีการ free() ) จนพบว่ามีแบบนั้นจริง  มี functionอยู่ตัวนึงที่เขียนไว้ไม่ดีทำให้เกิดการ malloc ซ้ำไปที่ตัวแปร global นั้นเรื่อยๆจนในที่สุดโปรแกรมก็ตายไป (ไม่ได้ตั้งใจจะขยายนะครับ แต่ถ้าจะขยายผมใช้ realloc)