Трассированием: как отладить сообщение об ошибке недопустимый аргумент


Я пишу программу python для монтирования файловой системы fuse через системный вызов mount с использованием ctypes. Теперь его давая недопустимый аргумент ошибка в системном вызове mount. Я проверил все аргументы, и они кажутся правильными. Я слышал от друга, что strace можно использовать для отладки таких ошибок. Кто-нибудь может подсказать мне, как использовать strace для отладки проблемы. Любая помощь будет оценена по достоинству. Заранее спасибо.

Позвольте мне сделать вопрос более общим, как я могу использовать strace для отладки та же проблема и в языке Си.

1 2

1 ответ:

Использовать strace довольно легко, но это может не дать вам нужную информацию.

Поскольку вы знаете, какой системный вызов вам нужен, проще всего было бы сделать:

strace -fv -e trace=mount mount /dev/sda1 /tmp

(замените mount /dev/... вашим скриптом python). -f должен следовать за детьми (вероятно, ненужными здесь), -v для многословия и -e trace=mount инструктирует strace отслеживать только mount syscall.

Пример вывода здесь:

$ sudo strace -fv -e trace=mount mount /dev/sda1 /tmp
mount("/dev/sda1", "/tmp", "ext2", MS_MGC_VAL, NULL) = 0

Итак, вы видите аргументы, переданные по существу в том виде, что они достигнут ядра и кода возврата.

Вы не получите "объяснения" EINVAL, но это должно произойти только тогда, когда исходный параметр имеет недопустимый суперблок, поэтому сообщение довольно явное (если вы не делаете что-то более экзотическое, в этом случае есть другие возможности, перечисленные здесь).