Я преследую 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: добавленного примечания о трассировании +
ли программа многопоточной? Возможно, что 'fd' был закрыт в каком-то другом потоке .... –
Это, и это еще одна причина, по которой мне очень хотелось бы взглянуть на то, что произошло с fd. –
Правильный способ решения таких проблем - полностью исключить возможность ошибки. Обновите свой код, чтобы у вас был единственный поток, который «владеет» файлом, который будет открывать, читать и закрывать файл напрямую, а другие потоки могут запрашивать только чтение/запись из потоковой сети (с использованием блокировок/подсчет семафора - еще одна возможность, но очередь обычно проще писать и безопаснее). –