c - 不使用 printf 时的段错误

标签 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 的任何其他操作,我仍然会遇到段错误。

我将如何开始调试它?

最佳答案

插入 printf() 调用会影响内存布局(因此它可以纯属偶然地掩盖一些内存损坏),以及执行时间(您使用线程,所以时间也相关) .

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

  • gdb 下运行您的可执行文件,这样你应该能够看到导致崩溃的确切操作,它是从哪里调用的等等。

  • valgrind 下运行它- 这个工具检测很多常见的错误,比如访问空闲的内存块、使用未初始化的变量、超出数组/缓冲区边界等。使用 valgrind 立即获得错误的确切位置并不少见,强烈推荐!

关于c - 不使用 printf 时的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280732/

相关文章:

c - 添加函数初始化矩阵时读取矩阵时出错

c - 使用 TSC(时间戳计数器)计算时间

c - ARM 的 ALSA 库和交叉编译

for-loop - Julia:以 For 循环宏为条件

java - Clojure:为 java for 循环返回一个迭代器

c - 将数组传递给函数以进行内存分配

c - 手工制作和自动生成的 makefile 在 windows 下失败但在 unix 上工作

C最长线算法

linux - 默认 bash 环境已更改。我如何将其恢复为默认值?

c++ - OpenMP/C++ 如何并行递增一个变量?