不使用printf时的Segfault

时间:2012-11-08 00:38:39

标签: c linux for-loop segmentation-fault printf

我正在使用POSIX线程,在程序结束时,我正在等待加入每个线程。经过一段时间的完美运行后,我的代码在等待线程时开始返回一个奇怪的错误。

pthreads threads[C+P];

for(i = 0; i < (C+P); i++)
{
    printf("%d\n", i);  
    pthread_join(threads[i]);
}

如果我删除了printf语句,或者将其替换为任何其他printf语句,延迟或对i的任何其他操作,我仍然会遇到段错误。

我将如何开始调试?

1 个答案:

答案 0 :(得分:6)

插入printf()调用会影响内存布局(因此,它可以通过纯粹的意外掩盖一些内存损坏)以及执行时序(您使用线程,因此时序也相关)。

但是,您应该进行一些常规调试,而不是任何猜测:

  • gdb下运行您的可执行文件,这样您就可以看到导致崩溃的确切操作,从哪里调用等等。

  • valgrind下运行 - 此工具检测到许多常见错误,例如访问free'd内存块,使用未初始化的变量,超出数组/缓冲区边界等。立即获取并不常见错误与valgrind的确切位置,我强烈推荐它!