LINUX.ORG.RU

[UDAV][HDF5]2 abalakin и др.


0

1

Обнаружил странное поведение UDAV: при сохранении данных и скрипта в hdf5-файл (save as), которого еще не существует, создается не файл с указанным именем, а файл '\001' , 'йла или каталога' (sic!) и т.п. Проблема воспроизводится легко: достаточно запустить udav, создать переменные и выполнить «сохранить как», указав любое имя с суффиксом .h5 или .hdf (например, aa.hdf).

Мой анализ (банально вставил отладочные printf-ы) показал, что порча имени происходит в методе ScriptWindow::saveHDF5 при вызове H5Fcreate.

Проблема возникает даже на самом новом релизе (udav 0.7.0.1 + mathgl 1.11.0.1, svn не проверял), а также на udav 0.5.2 + libmgl5 1.9. У меня убунта 10.04 x86_64, hdf5 версии 1.8.4.

Не мог бы кто-нибудь помочь разобраться, из-за чего такое может происходить и как с этим бороться? К сожалению, у меня не хватает времени на самостоятельную отладку.

Вроде как до автора проще достучаться здесь, чем в официальном багтрекере.



Последнее исправление: Vadim_Z (всего исправлений: 1)

Частично разобрался. На самом деле проблемы две.

Первая возникает при первом сохранении в новый hdf5-файл. В силу каких-то причин вызов H5Eset_auto в начале метода saveHDF5 портит имя файла в виде C-строки, полученное вызовом fname=fileName.toAscii().constData(). Имя файла при этом заменяется на \001 и т.п.

Я вставил в начало функции main вызов H5open(), проблема исчезла; при этом, если H5open вставлять в saveHDF5 перед H5Eset_auto, проблема остается. Как я понял, и char* -строка, и стек ошибок hdf5 хранятся в thread-specific storage, возможно, эффект связан с этим. Если не вставлять вызов H5open(), а сделать копию имени файла fname перед вызовом H5Eset_auto с помощью strdup, проблема также решается.

Вторая проблема возникает при последующем сохранении в hdf5. H5Eset_auto не меняет имя файла, а в процессе вызова H5Fcreate имя меняется на 'йла или каталога' и т.п. Вызовом H5open() эта проблема не решается, но создание копии строки также помогает: исходное имя fname меняется, а его копия — нет.

К сожалению, я недостаточно знаю языки C, C++ и библиотеку pthreads, чтобы понять, что происходит.

Vadim_Z
() автор топика

Пояснение: кусок кода из файла scriptwindow.cpp, о котором речь идёт, выглядит так:

	const char *fname = fileName.toAscii().constData();
// <--- если здесь сделать strdup и пользоваться копией, всё ок

// <--- вот здесь fname портится первый раз (при 1м сохранении)
	H5Eset_auto(0,0);

// <--- здесь fname портится при 2м сохранении
	hf = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
Vadim_Z
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.