【问题标题】:EXC_BAD_ACCESS (KERN_INVALID_ADDRESS) during execution of malloc()执行 malloc() 期间的 EXC_BAD_ACCESS (KERN_INVALID_ADDRESS)
【发布时间】:2011-04-08 15:32:22
【问题描述】:

我正在使用以下 GCC 在 Mac OS X Snow Leopard 中编译 C 库:

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() 怎么会导致这样的问题呢?我什至没有向它传递一个指针!它是一个错误吗?有人见过这样的吗?

提前致谢!

【问题讨论】:

    标签: c gcc malloc osx-leopard memory-access


    【解决方案1】:

    最有可能的是,程序执行的早期部分正在写入它无权访问的内存,从而破坏了堆的数据结构。然后,稍后,malloc 被调用并试图跟随一个被废话覆盖的指针(或通过一个被废话覆盖的值索引某些东西,或其他),然后繁荣。

    您可能想尝试在valgrind 下运行您的测试套件,看看哪里出了问题。

    【讨论】:

    • 我有效地使用了 valgrind 并没有找到问题的根源......实际上,我不太了解如何阅读它的输出 - 它指出了问题,但我不明白它的含义。但是,我进行了一些代码审查和重写并解决了这个问题。我不知道问题出在哪里,但它已经解决了。但是,由于 valgrind 似乎是一个很棒的工具,因此我会将这个答案标记为已接受,这也是因为无论如何问题似乎已损坏堆。谢谢!
    【解决方案2】:

    这个问题的原因有很多:没有分配内存,指针指向错误的地方等等等等。

    就我而言,我分配了一个数组,例如ProjectMAX_PROJECT_COUNT 职位。我写了

    Project *array = malloc(MAX_PROJECT_COUNT);
    

    但它没有考虑Project 结构的大小!正确的解决方案是

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

    但是请注意,您的问题可能有很大不同,因此不可能应用相同的解决方案。

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 2020-04-13
      • 2017-04-02
      • 2023-03-23
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      相关资源
      最近更新 更多