【问题标题】:invalid read within valid memory region有效内存区域内的无效读取
【发布时间】:2012-06-14 10:25:02
【问题描述】:

我正在使用 Ptreads 开发一个简单的 OCR 程序,但由于某些奇怪的原因,该程序在一个简单的任务上崩溃了。

导致崩溃的行是一个简单的赋值: int **y=(mask->imdata); 所有指针都可以(在 malloc 和传递给此函数时检查,它们是相同的)

Valgrind 给出以下输出:

==28948== Thread 2:
==28948== Invalid read of size 4
==28948==    at 0x804913A: PearsonCorrelation (ocr_pool.c:239)
==28948==    by 0x8049342: PearsonCorrelator (ocr_pool.c:275)
==28948==    by 0x80497BF: characterSegmentation (ocr_pool.c:407)
==28948==    by 0x8049A33: lineSegmentation (ocr_pool.c:489)
==28948==    by 0x8049D64: doPage (ocr_pool.c:575)
==28948==    by 0x4076954: start_thread (pthread_create.c:300)
==28948==    by 0x41565ED: clone (clone.S:130)
==28948==  Address 0x49d18f8 is 8 bytes inside a block of size 12 free'd
==28948==    at 0x4023B6A: free (vg_replace_malloc.c:366)
==28948==    by 0x80489ED: freeImage (ocr_pool.c:77)
==28948==    by 0x8049F33: main (ocr_pool.c:610)

如您所见,报告的无效读取大小为 4,在 12 个字节的区域中偏移量为 8,这怎么可能是段错误的原因?

编辑:没有 Pthreads(执行与 pthreads_create() 调用相同的函数)它可以正常工作。即使在运行一个线程时,它仍然会产生段错误。

【问题讨论】:

  • 答案是:我没有加入线程,主线程已经释放了!感谢razlebe的回答!

标签: c pthreads valgrind


【解决方案1】:

我相信您可能是 freeing 在读取之前正在读取的内存,因为我希望这会像上面那样从 Valgrind 产生错误(尽管不直接看到它本身是如何发生的)会导致崩溃。)

如果您正在写入之前使用free 释放的内存,则分段错误可能来自程序中的其他地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2012-12-26
    • 2017-02-18
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多