【问题标题】:Segfault when NOT using printf [closed]不使用 printf 时的段错误 [关闭]
【发布时间】:2012-11-08 00:38:38
【问题描述】:

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

pthreads threads[C+P];

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

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

我将如何开始调试?

【问题讨论】:

  • 我会在程序段错误时使用gdb获取堆栈跟踪。
  • 知道线程[] 在哪里,它包含什么(我假设 pthread_t 值),我在堆栈中相对于它的位置(奇怪的是我知道,但你的问题也是如此)以及 C+P 如何与线程[] 的大小相关联可能会有所帮助。就目前而言,唯一可以获取更少信息的方法是,如果您从 sn-p 中省略了 for 循环。我们不知道threads[]是动态数组(pthread_t *threads;),还是固定数组(pthread_t threads[N];)等等。你能给我们一块更大的骨头吗?
  • 猜测一下,您的代码中的其他地方存在某种竞争条件。 printf(),是每次调用都会刷新的控制台 I/O,速度很慢,并且会掩盖这种情况。
  • millimoose:如果是这种情况,我希望延迟也能解决问题。 WhozCraig:除了最近的编辑,我真的不知道还能给你什么。我正在尝试弄清楚如何使用 gdb 来解决这个问题,但我并不精通。
  • edit 替换为 fflush 具有相同的效果。你是对的,我在其他地方发现了一个竞争条件。

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


【解决方案1】:

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

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

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

  • 在valgrind 下运行它 - 此工具检测到许多常见错误,例如访问已释放的内存块、使用未初始化的变量、超出数组/缓冲区边界等。立即获得准确位置的情况并不少见valgrind 的错误,我强烈推荐它!

【讨论】:

  • 这不是答案;应该是评论
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多