Ошибка, которая не отображается с отладчиком - PullRequest
2 голосов
/ 17 мая 2010

Я использую компилятор Intel FORTRAN для компиляции числовой библиотеки. Тестовый пример предоставил ошибки в libc.so.6. Когда я присоединяю отладчик Intel (IDB), приложение успешно проходит. Как отладить ошибку, когда отладчик предотвращает ошибку? Обратите внимание, что та же ошибка возникла с gfortran.

Я работаю в OpenSUSE 11.2 x64.

Ошибка:

forrtl: суровый (408): форт: (3): индекс # 1 массива B имеет значение -534829264, которое меньше нижней границы 1

Ответы [ 2 ]

3 голосов
/ 17 мая 2010

Сообщение об ошибке довольно ясно для меня, вы пытаетесь получить доступ к несуществующему элементу массива. Я подозреваю, что значение -534829264 является либо нежелательным, когда вы используете неинициализированную переменную для идентификации элемента в массиве, либо результатом целочисленного арифметического переполнения. В любом случае вы должны включить флаг компиляции для принудительной проверки границ массива и запуска некоторых тестов. Я думаю, что флаг для компилятора Intel будет -CB, но проверьте документацию.

Относительно того, почему программа, по-видимому, успешно работает в отладчике, я не могу сильно помочь, но, возможно, отладчик налагает некоторые значения по умолчанию на переменные, которых сама система времени выполнения не делает. Или какой-то другой фактор полностью ответственен.

EDIT:

Разве система во время выполнения не сообщает вам, какая строка кода вызывает проблему? Еще несколько вещей, чтобы попытаться диагностировать проблему. Используйте компилятор, чтобы предупредить вас о

  • использование переменных до их инициализации;
  • целочисленное арифметическое переполнение (не уверен, что компилятор может это определить?);
  • любые принудительные преобразования из одного типа в другой и из одного вида в другой в пределах одного типа.

Кроме того, проверьте, что целочисленный размер по умолчанию соответствует ожидаемому, и, что более важно, ожидаемому остальной части кода.

1 голос
/ 17 мая 2010

Не эксперт в этой области, но несколько вещей, которые следует учитывать:

1) Отладчик инициализирует сначала переменную, используемую в качестве индекса, нулем, но не отладка - нет, и поэтому переменная начинается со значения «мусор» (имелась старая версия Pascal, которая использовала это) .

2) Вы используете многопоточность? Если это так, то отладка меняет порядок выполнения, поэтому какой-то подготовительный поток завершает работу вовремя.

...