Ошибка, которая не проявляется при подключенном отладчике

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

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

Ошибка:

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


person ccook    schedule 17.05.2010    source источник


Ответы (2)


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

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

РЕДАКТИРОВАТЬ:

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

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

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

person High Performance Mark    schedule 17.05.2010
comment
Спасибо. Какие-нибудь советы, как найти, откуда идет звонок? Боюсь, меня испортила Visual Studio. - person ccook; 17.05.2010
comment
Спасибо за советы, однако это находится в выпущенной библиотеке (FISHPACK). Ошибки, которые я получаю, не имеют исходной информации. Я получаю что-то вроде: tblktri 00000000004A6AED Неизвестно Неизвестно Неизвестно tblktri 00000000004A55F5 Неизвестно Неизвестно Неизвестно libc.so.6 00007FAD079D6A7D Неизвестно Неизвестно Неизвестно - person ccook; 17.05.2010
comment
Спасибо, Марк. Я сделал именно это. Я также использовал их тестовый пример, поэтому весь их код. Я просмотрел код, и кажется, что это ошибка при расчете индекса по одному из методов. Я не уверен, что он представляет себя только потому, что я использую другой компилятор, чем они. Я написал автору то, что нашел. Спасибо за помощь! - person ccook; 17.05.2010
comment
Вы используете FISHPACK или FISHPACK90? В версии Fortran 90 компилятор, вероятно, может проверить правильность количества и типов аргументов в ваших вызовах — это может привести к ошибке. - person M. S. B.; 17.05.2010
comment
Я пробовал оба. Я получал неточные результаты с версией F77 и ошибку в версии F90. - person ccook; 18.05.2010

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

1) Сначала отладчик инициализирует переменную, используемую в качестве индекса, нулем, а не отладочная - нет, и поэтому переменная начинается с "мусорного" значения (в старой версии Паскаля это делалось).

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

person Swanny    schedule 17.05.2010
comment
Спасибо за баллы. К счастью, я не использую потоки. - person ccook; 17.05.2010