glibc detected *** double free 錯誤解決方法

glibc detected *** double free 錯誤解決方法

定位問題:*** glibc detected *** : double free or corruption (!prev): 0x09b077d8

Q: 在執行一個程序時,出現如下錯誤:
*** glibc detected *** double free or corruption: 0x0937d008 ***
是怎麼回事?
A: 設置MALLOC_CHECK_環境變量再運行程序,呵呵,錯誤信息消失

MALLOC_CHECK_=0 ./myprogram

紅 帽企業 Linux 4 提供的 glibc 可以執行附加的內部數據健全檢查,從而在儘可能早的時候發現和保護數據被破壞。在默認的情況下,當被破壞的數據被發現時,與以下相似的錯誤信息會被顯示在標準的錯誤輸出上(如果 stderr 沒有打開,會被記錄在 syslog 中):

*** glibc detected *** double free or corruption: 0x0937d008 ***

在默認的情況下,產生這個錯誤的程序也會被中止。但是,這(以及是否產生錯誤信息)可以通過環境變量 MALLOC_CHECK_ 來控制。以下的設置是被支持的:

0 - 不產生錯誤信息,也不中止這個程序

1 - 產生錯誤信息,但是不中止這個程序

2 - 不產生錯誤信息,但是中止這個程序

3 - 產生錯誤信息,並中止這個程序

備註
如果 MALLOC_CHECK_ 被設置爲除 0 以外的值,這會使 glibc 進行更多的檢查並可能影響到系統的性能。
3.3 常用Linux內存管理及調試工具
在Linux下,除了Gdb,還有很多調試工具,例如Binutil系列工具、Glibc提供的內存檢測工具、MemWatch內存錯誤檢測工具以及valgrind工具。它們都各有所長,側重方面有所不同。本節介紹幾種常用的調試工具。
3.3.1 mcheck函數
mcheck是Glibc提供函數,聲明如下:

int mcheck (void (*abortfn) (enum mcheck_status status))
此函數通知malloc進行一致性檢查。它可以檢查出內存分配不匹配的情況。

enum mcheck_status mprobe (void *pointer)
可顯式地調用它來對指針進行一致性檢查。以下是可能的返回值即可能發生的錯誤。mcheck_status有以下枚舉值:
MCHECK_DISABLED:禁止mcheck,不做檢查。
MCHECK_OK:沒有發現內存問題。
MCHECK_HEAD:數組或指針下溢出。
MCHECK_TAIL:數組或指針上溢出。
MCHECK_FREE:空間已經被釋放。
查看glibc/malloc中的代碼可以發現以上函數正是通過memrecorder類似的機制實現的。此機制可通過以下方法來啓動:
(1)在main()函數開始時或適當位置顯式地調用mcheck()函數。
(2)加-lmcheck重新連接可執行程序。
(3)Glibc還指出另一種啓動這種檢查機制的方法:即設置環境變量MALLOC_CHECK_的值。
若將MALLOC_CHECK_設置爲0,則在檢查到錯誤時不作任何提示。
若將MALLOC_CHECK_設置爲1,則在檢查到錯誤時打印一條信息到標準錯誤輸出。
若將MALLOC_CHECK_設置爲2,則在檢查到錯誤時直接調用abort()中止程序。

[root@localhost root]# cat MALLOC_CHECK_Example.c //源代碼內容,存儲內存管理問題
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *ptr1;
char *ptr2;
ptr1 = malloc(512);
ptr2 = malloc(512);
ptr2 = ptr1;
printf(“ok\n”);
free(ptr2);
free(ptr1);
printf(“really ok?\n”);
}
以下是加上-lmcheck編譯並運行的情況。

[root@localhost ~]# gcc -o MALLOC_CHECK_Example MALLOC_CHECK_Example.c -lmcheck
[root@localhost ~]# ./ MALLOC_CHECK //運行
ok
memory clobbered before allocated block
Aborted
[root@localhost root]# gcc -o MALLOC_CHECK_Example MALLOC_CHECK_Example.c
[root@localhost root]# MALLOC_CHECK_=0 ./MALLOC_CHECK_Example //設置宏值爲0
ok
really ok?
[root@localhost root]# MALLOC_CHECK_=1 ./MALLOC_CHECK_Example //設置宏值爲1
malloc: using debugging hooks
ok
free(): invalid pointer 0x8049628!
really ok?
[root@localhost root]# MALLOC_CHECK_=2 ./MALLOC_CHECK_Example //設置宏值爲2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章