我正在使用Ubuntu 14.04和gcc 4.8.2上的Hope函数式程序,尝试递归计算大量质数。但是,我遇到了一个分段错误: 0x000000000040e03f in reach。
cell=<error reading variable: Cannot access memory at address 0x7fffff7feff8> at runtime.c:250
访问地址0x7fffff7feff8时发生分段错误。
reach例程执行的操作是使用垃圾回收标记-清除方法取消标记可以被当前表达式到达的堆项。堆栈非常深(超过100000个调用),但没有发生堆栈溢出:
base_memory = 0x7ffff35a4010
top_string = 0x7ffff35a5260
BaseHeap = 0x7ffff35a5260
heap = 0x7ffff603a450
stack = 0x7ffff72da498
TopStack = 0x7ffff7584d60
从 base_memory 到 TopStack 的区域是使用 malloc 分配的。
每当发生段错误时,地址总是 0x7fffff7feff8,即使是在非常不同的函数中。
如果你谷歌搜索 0x7fffff7feff8,会有相当多的条目显示关于此地址的段错误,但没有解决方案。
我加入了代码来检查堆地址是否在堆范围内,但它从未失败过。
我使用了 gdb 进行调试。
find 0x7ffff35a4010,0x7ffff7584d60,0x7fffff7feff8
什么都没找到。
为什么地址0x7fffff7feff8
在许多问题中出现?堆栈机制有问题吗,还是我需要改变代码以适应平台?
valgrind
下运行程序可能会提示问题所在。如果您已经这样做了,请跳过此评论 :) - Diego