Идентификация файла, вызывающего зависание от strace


У меня есть программа GTK, работающая на Ubuntu 10.04, которая зависает в прерываемом состоянии, и я хотел бы понять вывод strace. В частности, у меня есть такая строка:

read(5, 0x2ba9ac4, 4096) = -1 EAGAIN (Resource temporarily unavailable)

Я подозреваю, что 5 - это дескриптор файла, 0x2ba9ac4 адрес в этом файле, который нужно прочитать, и 4096 объем данных для чтения. Вы можете это подтвердить? Что еще более важно, как определить, какой файл программа пытается прочитать? Этот файловый дескриптор не существует в /proc/pid/fd (вероятно, поэтому программа вешает).

3 4

3 ответа:

Вы можете найти, какой файл использует этот файловый дескриптор, вызвав strace -o log -eopen,read yourprogram. Затем найдите в файле log интересующий вас вызов read. Начиная с этой строки (а не с первой строки файла), найдите вверх первое вхождение этого дескриптора файла (возвращаемое вызовом open).

Например, здесь файловый дескриптор, возвращаемый open, равен 3:

open("/etc/ld.so.cache", O_RDONLY)      = 3

Второй аргумент для read() - это просто указатель назначения, он запрашивает чтение из файлового дескриптора 5 и максимум 4096 байт. Смотритена странице руководства Для read().

Добавление к ответу @liberforce, если процесс уже запущен, вы можете получить имя файла с помощью lsof

Форма strace

[pid  7529] read(102, 0x7fedc64c2fd0, 16) = -1 EAGAIN (Resource temporarily unavailable)

Теперь, с lsof

lsof -p 7529 | grep 102
java    7529 luis  102u  0000                0,9        0     9178 anon_inode