2013-03-26 2 views
1

Я преследую Heisenbug в процессе linux x64. (Присоединение к процессу с помощью отладчика или strace делает проблему никогда не возникающей.) Я смог установить бесконечный цикл, когда код обнаруживает ошибку и прикрепляется с помощью gdb таким образом, но это просто показывает мне, что файл дескриптор (fd), который должен работать, уже недействителен. Я действительно хочу получить историю fd, а затем попробовать strace, но, конечно, это не позволит проблемному репо.Способы получения strace-подобного вывода для Heisenbug

Другие факторы указывают на то, что проблема с gdb/strace - это время. Я попытался запустить strace с -etrace=desc или даже -eraw=open и выводить на ramdisk, чтобы увидеть, поможет ли это уменьшить накладные расходы strace правильно, чтобы вызвать проблему, но не удастся. Я попытался запустить strace +, но это на порядок медленнее, чем strace.

Процесс, к которому я прикрепляюсь, частично коммерческий двоичный файл, к которому у меня нет доступа к исходному коду, и частично код, который я предварительно загружаю в пространство процесса, поэтому printf -всюду не возможно на 100%.

Есть ли у вас предложения по отслеживанию истории fd?

Update: добавленного примечания о трассировании +

+0

ли программа многопоточной? Возможно, что 'fd' был закрыт в каком-то другом потоке .... –

+0

Это, и это еще одна причина, по которой мне очень хотелось бы взглянуть на то, что произошло с fd. –

+0

Правильный способ решения таких проблем - полностью исключить возможность ошибки. Обновите свой код, чтобы у вас был единственный поток, который «владеет» файлом, который будет открывать, читать и закрывать файл напрямую, а другие потоки могут запрашивать только чтение/запись из потоковой сети (с использованием блокировок/подсчет семафора - еще одна возможность, но очередь обычно проще писать и безопаснее). –

ответ

1

Я решил проблему трассировки:

  1. Предзагрузки функции обертка заглушки вокруг соответствующих системных вызовов, open(), close() и poll()
  2. Logging соответствующих информацию в имени файла, созданном на ramdisk.

(Фактический выпуск гонки, с poll() Тринга ядра для доступа pollfd памяти и возвращения EFAULT.)

Смежные вопросы