首先请原谅我没有提供任何代码,但很难仅 C+P 摘录,因为错误是随机引起的。
使用 GCC 编译 C 源代码时遇到一个非常奇怪的错误。我正在为 Erlang 开发一个链接驱动程序,但我不明白是什么导致了错误。错误是这样的:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xffffffffb012aae8
[Switching to process 7316 thread 0x1503]
ktqk_exec (query=0x13e0af00, table=0x13e00ea0) at ktqk.c:215
215 clock_t start = clock();
我正在运行用 GDB 包装的 Erlang 虚拟机,所以我可以访问内存部分。对我来说,高地址0xffffffffb012aae8
看起来很可疑。但是,使用 Clang,一切都按预期工作,没有错误,没有段错误。我试图调查:
(gdb) p clock
$1 = {<text variable, no debug info>} 0x7fff85c29fd0 <clock>
(gdb) p start
$2 = 2954013712
所以这个值显然没有初始化,之前就崩溃了。当我在同一个文件中设置断点时,它们会被简单地跳过。为什么一切都适用于 Clang,但不适用于 GCC?
由于 Clang 默认使用 C99 和 GCC C89,因此我必须-std=c99
在 GCC 上包含用于编译的标志。这可能是一个潜在的来源吗?但是,当我注释掉上面的代码时,它会在下一个函数调用时失败。所以它似乎与函数调用有关。尽管如此,这一行之前的所有函数调用都很好。
一个非常奇怪的错误。有人有什么想法吗?对不起,这个相当模糊的解释,我根本不理解这个错误。
一切顺利,马丁