У меня есть утилита тестирования, которая использует Linux aio_write и aio_read.
Эта утилита тестирования оборачивает мою статическую библиотеку и тестирует ее. Эта библиотека многопоточная черный ящик.
До сих пор все работало нормально. Но теперь мы внесли большие изменения в этот черный ящик, который вызывает сбой утилиты тестирования, как только она совершает первый ввод-вывод.
Этот IO возвращается с ошибкой 22 == EINVAL.
На основании man-страниц aio_write эта ошибка выдается в случае, если одно из следующих полей недопустимо -> aio_offset, aio_reqprio, aio_nbytes.
Я запускаю его внутри GDB и проверяю их значения так же, как и все остальные значения внутри struct aiocb * входной параметр.
Мой вывод заключается в том, что все входные параметры действительны.
Я подозреваю, что что-то изменилось в том, как работают потоки внутри черного ящика. Это то, что я подозреваю, вызывая эту проблему (я не могу найти другого объяснения).
Что я действительно пытаюсь понять, так это то, что aio_write () возвращает код ошибки EINVAL ???
Просто чтобы уточнить, когда я заменяю черный ящик на более старую версию, используя ту же самую утилиту тестирования, она работает нормально …. (я также проверил входные аргументы здесь, поскольку увидел, что они соответствуют входным аргументам неверной версии).
Вы можете взглянуть на реализацию aio в исходном коде Linux в папке linux-kernel-source/fs/aio.c
К сожалению, есть много точек, где возвращается -EINVAL. Как отметил @myaut в своем комментарии, я рекомендую вам использовать strace
, Другое решение — изменить код, скомпилировать его и проверить, где он не работает.