Назад | Перейти на главную страницу

Различные дистрибутивы Linux производят разный машинно-сгенерированный код

У меня очень интересный и неприятный вопрос. Компания, в которой я работаю, использует приложение для моделирования и проверки электротехники. Это приложение производит вывод на основе случайного начального числа. Когда у вас есть случайное начальное число для данной симуляции, вы можете передать это случайное начальное число обратно в приложение, и вы должны получить идентичные результаты. К сожалению, мы сталкиваемся с проблемами, когда разные дистрибутивы Linux дают разные результаты при одном и том же случайном начальном значении. Это проблематично, потому что инженеры, использующие эти инструменты, полагаются на способность каждый раз воспроизводить точные результаты. Я должен упомянуть, что мы используем именно одна и та же версия приложения в разных дистрибутивах - фактически, она смонтирована по NFS, поэтому каждый раз проверяется одна и та же точка установки.

На данный момент я тестирую следующие операционные системы:

CentOS 5
CentOS 6
SLES 11
openSuSE 11.4
openSuSE 12.1
openSuSE 12.2

Я вижу результаты высокого уровня: CentOS 5 и SLES 11 дают одинаковые результаты, а CentOS 6 и openSuSE 11.4 / 12.1 / 12.2 дают одинаковые результаты. CentOS 5 и SLES 11 - это дистрибутивы, указанные как поддерживаемые производителем программного обеспечения, поэтому на данный момент мы смотрим на результат, полученный этими двумя дистрибутивами, как на «правильный». На данный момент мне не удалось найти последовательного набора сходств или различий, который бы рассказал мне, что происходит. Например, вот версии ядра, используемые в разных системах:

CentOS 5 - 2.6.18
CentOS 6 - 2.6.32
SLES 11 - 3.0.51
openSuSE 11.4 - 2.6.37.6
openSuSE 12.1 - 3.1.10
openSuSE 12.2 - 3.4.11

Итак, не вдаваясь в подробности о том, какие патчи могут быть применены к каким версиям ядра в этих дистрибутивах, я уже могу сказать, что это не серьезное изменение, например, между 2.6 и 3.0, потому что SLES 11 и CentOS 5 дают согласованные результаты, но у них разные основные версии ядра. Я также посмотрел на glibc и обнаружил - openSuSE 11.4 и SLES 11 имеют очень близкие версии пакетов glibc (2.11.3).

У меня такой вопрос: где еще я должен искать, чтобы попытаться отследить эту проблему? Я начал получать выходные данные strace и пытаться их сравнивать, но это отнимает много времени и не имеет большого значения, когда выходные данные strace сильно различаются даже между дистрибутивами, которые производят идентичный результат. Я не могу пойти к производителю приложения, так как платформы, с которыми у меня возникают проблемы, указаны как неподдерживаемые, поэтому они просто скажут мне, чтобы я заблудился. Есть какие-нибудь подсказки о том, что делать дальше, чтобы отследить проблему?

В последний раз, когда я столкнулся с этой конкретной проблемой, оказалось, что разница в том, работают ли две операционные системы в 32-битном или 64-битном режиме. (Предложение @kormoc полезно, поскольку gdb именно так я его выделил) Поскольку вы не подтвердили, что это условие было одинаковым между серверами, я бы рекомендовал вам начать поиск там.

Если архитектура действительно отличается, вы можете подтвердить это как источник вашей проблемы, настроив одну из проблемных ОС с соответствующей архитектурой и проверив, сходятся ли результаты еще раз. Это должно предоставить вашим разработчикам достаточно информации для работы над внедрением независимых от платформы семян.