2012-06-22 65 views
4

我做了一個程序,有時它會拋出一個堆棧粉碎檢測到的錯誤。它工作99%的時間,但與某些文件,它會引發錯誤。 我用valgrind嘗試識別錯誤,但我無法理解日誌文件。 所以在這裏,它是:C瞭解valgrind,堆棧砸錯

==3797== Memcheck, a memory error detector 
==3797== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
==3797== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
==3797== Command: ./pargrep de nuevo.txt 
==3797== Parent PID: 2367 
==3797== 
==3797== 
==3797== HEAP SUMMARY: 
==3797==  in use at exit: 33,339 bytes in 5 blocks 
==3797== total heap usage: 12 allocs, 7 frees, 35,025 bytes allocated 
==3797== 
==3797== 4 bytes in 1 blocks are still reachable in loss record 1 of 5 
==3797== at 0x4026864: malloc (vg_replace_malloc.c:236) 
==3797== by 0x8048FDB: maestro (padre.c:39) 
==3797== by 0x8048ABF: main (main.c:62) 
==3797== 
==3797== 55 bytes in 1 blocks are still reachable in loss record 2 of 5 
==3797== at 0x4026864: malloc (vg_replace_malloc.c:236) 
==3797== by 0x40B878B: __libc_message (libc_fatal.c:138) 
==3797== by 0x413D09F: __fortify_fail (fortify_fail.c:32) 
==3797== by 0x413D049: __stack_chk_fail (stack_chk_fail.c:29) 
==3797== by 0x8049665: contar_palabra (funcion.c:51) 
==3797== by 0x80494C5: hilos_hijos (hilos.c:90) 
==3797== by 0x4041E98: start_thread (pthread_create.c:304) 
==3797== by 0x41279ED: clone (clone.S:130) 
==3797== 
==3797== 136 bytes in 1 blocks are possibly lost in loss record 3 of 5 
==3797== at 0x4025315: calloc (vg_replace_malloc.c:467) 
==3797== by 0x4010CD7: allocate_dtv (dl-tls.c:300) 
==3797== by 0x401146B: _dl_allocate_tls (dl-tls.c:464) 
==3797== by 0x40425C6: [email protected]@GLIBC_2.1 (allocatestack.c:570) 
==3797== by 0x80490E1: maestro (padre.c:84) 
==3797== by 0x8048ABF: main (main.c:62) 
==3797== 
==3797== 352 bytes in 1 blocks are still reachable in loss record 4 of 5 
==3797== at 0x4026864: malloc (vg_replace_malloc.c:236) 
==3797== by 0x40B3537: __fopen_internal (iofopen.c:76) 
==3797== by 0x40B360B: [email protected]@GLIBC_2.1 (iofopen.c:107) 
==3797== by 0x804907D: maestro (padre.c:66) 
==3797== by 0x8048ABF: main (main.c:62) 
==3797== 
==3797== 32,792 bytes in 1 blocks are still reachable in loss record 5 of 5 
==3797== at 0x4026864: malloc (vg_replace_malloc.c:236) 
==3797== by 0x40EBA18: __alloc_dir (opendir.c:186) 
==3797== by 0x40EBB49: opendir (opendir.c:141) 
==3797== by 0x8049013: maestro (padre.c:53) 
==3797== by 0x8048ABF: main (main.c:62) 
==3797== 
==3797== LEAK SUMMARY: 
==3797== definitely lost: 0 bytes in 0 blocks 
==3797== indirectly lost: 0 bytes in 0 blocks 
==3797==  possibly lost: 136 bytes in 1 blocks 
==3797== still reachable: 33,203 bytes in 4 blocks 
==3797==   suppressed: 0 bytes in 0 blocks 
==3797== 
==3797== For counts of detected and suppressed errors, rerun with: -v 
==3797== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 15 from 8) 

我真的不明白什麼的error.I欣賞的幫助。

回答

0

Valgrind告訴你這些消息已經分配了內存(並向你展示了對malloc的調用是如何產生的堆棧跟蹤),但是這些分配內存從未被釋放。

更多信息可以在http://valgrind.org/docs/manual/mc-manual.html#mc-manual.leaks

+0

好的,好吧我明白你在說什麼。我檢查了「仍然可達」錯誤的行,這些行是我爲全局變量賦值的地方。可能丟失的是當我創建一些線程。和記錄2,該行是函數的結尾。所以我真的不知道問題出在哪裏。 – Alessandroempire

+0

仍可到達意味着程序仍然持有指向已分配內存的指針。可能失去了意味着valgrind認爲你可能清除了指向內存分配的指針,但從未釋放內存。這些內存泄漏可能與您的其他問題無關,因爲malloc是關於堆內存的,而不是堆棧。在某些情況下,釋放堆分配並不值得,因爲在程序退出時它們全部被釋放。 – mlibby

5

需要beween棧smahing和堆內存錯誤的不同被發現。

Valgrind告訴你一些內存沒有被釋放,有些內存可能丟失。但這可能與你真正的問題無關:堆棧粉碎。

棧意味着:局部變量(通常字符數組),沒有被分配等

堆任何其他陣列:任何已經alloced使用malloc,釋放calloc,realloc的等

所以,如果你得到一個堆棧粉碎,機會很高,你在某個地方寫了一個數組的末尾。 首先檢查strcpy,memcpy和數組訪問權限(寫入未分配內存的地方)。

+0

+1用於區分自動和動態存儲持續時間錯誤 –

0

valgrind沒有檢測到array overruns,這可能是您觀察到的堆棧粉碎的原因。

2

使用Valgrind 3.7.0,您可以嘗試使用實驗工具exp-sgcheck ,該工具會查找堆棧和全局超限。如上所述,這是一個實驗性工具,因此可能不會像memcheck和其他非實驗性Valgrind工具那樣高質量地提供 。 (例如可能給出假陽性和/或假陰性)。 然而,exp-sgcheck幫助我找到了一個令人討厭的數組溢出錯誤。