我编译在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()
造成这样的问题?我甚至没有通过它的指针!这是一个错误吗?有人看过类似的东西吗?
在此先感谢!
我有效地使用了valgrind,没有找到问题的根源......其实,我不太清楚如何读取它的输出 - 它指出了问题,但我不明白它的含义。但是,我做了一些代码审查和重写,并解决了这个问题。我不确切地知道问题的依据,但解决了。由于valgrind似乎是一个很好的工具,但是,我会将这个答案标记为已接受,也是因为问题似乎是堆损坏了。谢谢! – brandizzi 2011-04-10 15:20:51