2011-04-08 76 views
1

我編譯在Mac OS X Snow Leopard的C庫與folloing GCC期間:EXC_BAD_ACCESS(KERN_INVALID_ADDRESS)的malloc的執行()

Diderot:~ brandizzi$ gcc -v 
Using built-in specs. 
Target: i686-apple-darwin10 
Configured with: /var/tmp/gcc/gcc-5666.3~6/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 
Thread model: posix 
gcc version 4.2.1 (Apple Inc. build 5666) (dot 3) 

當我運行這個庫的一些單元測試(這是寫在CuTest)其中一個測試出現問題:EXC_BAD_ACCESS信號。這是一個常見的問題,我對這類問題有一些瞭解 - 我是一個Linux人員,稱它爲「分段錯誤」,瞭解正在發生的事情以及解決問題的常用方法。令人驚歎的是,執行malloc函數時,執行了的錯誤訪問。看看我在GDB中獲得的回溯:

(gdb) bt 
#0 0x00007fff89000a34 in tiny_free_list_add_ptr() 
#1 0x00007fff88ffe147 in tiny_malloc_from_free_list() 
#2 0x00007fff88ffcfdd in szone_malloc_should_clear() 
#3 0x00007fff88ffceaa in malloc_zone_malloc() 
#4 0x00007fff88ffb1a8 in malloc() 
#5 0x0000000100008c72 in util_copy_string (string=0x100008e48 "libsecretary") at src/util.c:7 
#6 0x0000000100008126 in project_new (name=0x100008e48 "libsecretary") at src/project.c:8 
#7 0x00000001000078b9 in secretary_start (secretary=0x10080b000, name=0x100008e48 "libsecretary") at src/secretary.c:23 
#8 0x00000001000020f8 in test_secretary_move_task_from_project_to_project (test=0x1001005b0) at src/test/secretary.c:146 
#9 0x0000000100006eae in CuTestRun (tc=0x1001005b0) at cutest/CuTest.c:143 
#10 0x00000001000075c1 in CuSuiteRun (testSuite=0x100800000) at cutest/CuTest.c:289 
#11 0x0000000100001527 in RunAllTests() at src/test/run_all.c:22 
#12 0x000000010000156b in main() at src/test/run_all.c:32 

這個測試案例有以下幾行,並且錯誤總是發生在第四個。如果我切換線路以任何方式,問題還是發生在第四招:

Secretary *secretary = secretary_new(); 
Task *task = secretary_appoint(secretary, "Test task transference"); 
Project *destination = secretary_start(secretary, "Chocrotary"); 
Project *origin = secretary_start(secretary, "libsecretary"); 

那麼,如何才能malloc()造成這樣的問題?我甚至沒有通過它的指針!這是一個錯誤嗎?有人看過類似的東西嗎?

在此先感謝!

回答

3

最有可能的是,程序執行前的某些內容正在寫入內存中,它無權訪問內存,從而破壞了堆的數據結構。然後,malloc被調用,並試圖跟隨一個被無意義覆蓋的指針(或者通過一個被廢話或其他東西覆蓋的值來索引某些東西),並且繁榮。

您可能想要嘗試運行valgrind下的測試套件,以查看事情首先出錯的地方。

+0

我有效地使用了valgrind,沒有找到問題的根源......其實,我不太清楚如何讀取它的輸出 - 它指出了問題,但我不明白它的含義。但是,我做了一些代碼審查和重寫,並解決了這個問題。我不確切地知道問題的依據,但解決了。由於valgrind似乎是一個很好的工具,但是,我會將這個答案標記爲已接受,也是因爲問題似乎是堆損壞了。謝謝! – brandizzi 2011-04-10 15:20:51

0

有非常多的原因這個問題:一個沒分配內存,指針指向了錯誤的地方等等,等等

在我而言,我分配的例如數組ProjectMAX_PROJECT_COUNT職位。我寫了

Project *array = malloc(MAX_PROJECT_COUNT); 

但它沒有考慮Project結構的大小!正確的解決方案是

Project *array = malloc(MAX_PROJECT_COUNT*sizeof(Project)); 

但是,請注意,您的問題可能會有很大差異,因此不可能應用相同的解決方案。

相關問題