Идентификация файла, вызывающего зависание от strace - PullRequest
4 голосов
/ 04 марта 2011

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

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

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

Ответы [ 3 ]

8 голосов
/ 07 марта 2011

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

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

open("/etc/ld.so.cache", O_RDONLY)      = 3
0 голосов
/ 22 июня 2016

Добавление к ответу @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
0 голосов
/ 04 марта 2011

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

...