【发布时间】:2014-05-12 11:34:37
【问题描述】:
在 linux 上,使用 gcc 作为编译器,我得到了臭名昭著的核心转储错误。 全球声明:
#define MAX_N 10000
double cost[MAX_N][MAX_N]={0};
int stack[MAX_N];
int visited[MAX_N];
错误发生的地方(一旦我注释掉这些行就消失了):
for(q=0;q<5;++q)
{
visited[q]=0;
stack[q]=0;
}
这段代码位于一个函数中,该函数被调用了 10,000 多次。所以每次调用函数时,都需要进行这种初始化!我试过使用 memset,但这似乎也没有帮助!
【问题讨论】:
-
这不一定是错误发生的地方。注释掉这些行可能会改变一些导致其他代码崩溃的东西
-
10000 不是大尺寸。显然,错误在其他地方。出现这种错误,触发远离源头的故障是正常的。
-
我如何追踪错误发生的确切位置?
-
这部分代码没有问题,因为一切都已正确初始化。由于您已经有一个核心转储,您可以将它与gdb 和编译的可执行文件
-g一起使用以获取堆栈跟踪:gdb /path/to/exe /path/to/core,然后执行bt。 -
总结一下。错误不在您提供的代码中。我建议使用 valgrind 工具来检测实际的故障点。您可以搜索 SO 或网络,或使用 valgrind 文档来了解如何使用它来检测段错误。