Ошибка сегментации при чтении набора данных из файла ".h5", сжатого с помощью blosc - PullRequest
0 голосов
/ 18 июня 2020

У меня проблема при попытке прочитать набор данных из файла, который был написан с помощью фильтра «blos c».

После долгой борьбы мне удалось найти проблему в «H5D_READ» функция из базовой библиотеки HDF5. Когда я пытаюсь читать из общего файла, все в порядке (вывод valgrind чистый, без утечки памяти), но когда я пытаюсь получить доступ к набору данных, расположенному в файле, сжатом с помощью blos c, я получаю ошибку сегментации ошибка.

Это результат valgrind, когда я пытаюсь получить доступ к этому типу набора данных:

pasquale@pasquale:~/Trial$ valgrind ./Analysis 
==125702== Memcheck, a memory error detector
==125702== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==125702== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==125702== Command: ./Analysis
==125702== 
/ {
  Group: df {
    Dataset: axis0
    Dataset: axis1
    Dataset: block0_items
    Dataset: block0_values
  }
}

Stiamo esaminando il dataset: axis0

Numero di dimensioni del dataspace: 1

Il dataset ha dimensioni: 2101

Il dataset ha classe: 0

Il dataset è fatto di interi
==125702== Invalid free() / delete / delete[] / realloc()
==125702==    at 0x483CA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheckamd64-linux.so)
==125702==    by 0x484BC52: blosc_filter (in /home/pasquale/hdf5/lib/plugin/libH5Zblosc.so)
==125702==    by 0x49679E: H5Z_pipeline (H5Z.c:1324)
==125702==    by 0x4C6CDE: H5D__chunk_lock (H5Dchunk.c:3955)
==125702==    by 0x4C8D53: H5D__chunk_read (H5Dchunk.c:2593)
==125702==    by 0x1D4110: H5D__read (H5Dio.c:566)
==125702==    by 0x4840D7: H5VL__native_dataset_read (H5VLnative_dataset.c:166)
==125702==    by 0x45FB48: H5VL__dataset_read (H5VLcallback.c:2045)
==125702==    by 0x469EAC: H5VL_dataset_read (H5VLcallback.c:2079)
==125702==    by 0x1D25CD: H5Dread (H5Dio.c:191)
==125702==    by 0x14056F: main (in /home/pasquale/Trial/Analysis)
==125702==  Address 0x5039c00 is 48 bytes inside a block of size 885 alloc'd
==125702==    at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==125702==    by 0x2C0315: H5MM_malloc (H5MM.c:292)
==125702==    by 0x4BD612: H5D__chunk_mem_alloc (H5Dchunk.c:1404)
==125702==    by 0x4C6A50: H5D__chunk_lock (H5Dchunk.c:3940)
==125702==    by 0x4C8D53: H5D__chunk_read (H5Dchunk.c:2593)
==125702==    by 0x1D4110: H5D__read (H5Dio.c:566)
==125702==    by 0x4840D7: H5VL__native_dataset_read (H5VLnative_dataset.c:166)
==125702==    by 0x45FB48: H5VL__dataset_read (H5VLcallback.c:2045)
==125702==    by 0x469EAC: H5VL_dataset_read (H5VLcallback.c:2079)
==125702==    by 0x1D25CD: H5Dread (H5Dio.c:191)
==125702==    by 0x14056F: main (in /home/pasquale/Trial/Analysis)
==125702== 
==125702== Invalid read of size 1
==125702==    at 0x4842219: bcmp (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==125702==    by 0x2BFFE6: H5MM__is_our_block (H5MM.c:141)
==125702==    by 0x2C0122: H5MM_xfree (H5MM.c:534)
==125702==    by 0x4BD55C: H5D__chunk_mem_xfree (H5Dchunk.c:1435)
==125702==    by 0x4C5562: H5D__chunk_flush_entry (H5Dchunk.c:3495)
==125702==    by 0x4C5A6A: H5D__chunk_cache_evict (H5Dchunk.c:3550)
==125702==    by 0x4C5D64: H5D__chunk_dest (H5Dchunk.c:2918)
==125702==    by 0x1CB9B1: H5D_close (H5Dint.c:2000)
==125702==    by 0x485A65: H5VL__native_dataset_close (H5VLnative_dataset.c:634)
==125702==    by 0x46023F: H5VL__dataset_close (H5VLcallback.c:2595)
==125702==    by 0x46B830: H5VL_dataset_close (H5VLcallback.c:2633)
==125702==    by 0x1C46C1: H5D__close_cb (H5Dint.c:352)
==125702==  Address 0x5045180 is 16 bytes after a block of size 320 in arena "client"
==125702== 
    Analysis: H5MM.c:232: H5MM_final_sanity_check: Assertion `0 == H5MM_curr_alloc_bytes_s' failed.
==125702== 
==125702== Process terminating with default action of signal 6 (SIGABRT)
==125702==    at 0x4C3318B: raise (raise.c:51)
==125702==    by 0x4C12858: abort (abort.c:79)
==125702==    by 0x4C12728: __assert_fail_base.cold (assert.c:92)
==125702==    by 0x4C23F35: __assert_fail (assert.c:101)
==125702==    by 0x2C007F: H5MM_final_sanity_check (H5MM.c:232)
==125702==    by 0x142A88: H5_term_library (H5.c:420)
==125702==    by 0x4C36A26: __run_exit_handlers (exit.c:108)
==125702==    by 0x4C36BDF: exit (exit.c:139)
==125702==    by 0x4C140B9: (below main) (libc-start.c:342)
==125702== 
==125702== HEAP SUMMARY:
==125702==     in use at exit: 4,469 bytes in 4 blocks
==125702==   total heap usage: 7,129 allocs, 7,126 frees, 66,350,735 bytes allocated
==125702== 
==125702== LEAK SUMMARY:
==125702==    definitely lost: 3,392 bytes in 2 blocks
==125702==    indirectly lost: 0 bytes in 0 blocks
==125702==      possibly lost: 0 bytes in 0 blocks
==125702==    still reachable: 1,077 bytes in 2 blocks
==125702==         suppressed: 0 bytes in 0 blocks
==125702== Rerun with --leak-check=full to see details of leaked memory
==125702== 
==125702== For lists of detected and suppressed errors, rerun with: -s
==125702== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Annullato (core dump creato)

Я не привык читать вывод valgrind, но я думаю, что есть какая-то ошибка в управление памятью в плагине blos c, который я установил в HDF5. Я использую HDF5 1.12.0, созданный из исходного кода, и плагин blos c, предоставленный группой hdf в пакете «плагины фильтров HDF5». Спасибо за помощь

...