Я нахожусь в очень странной ситуации, когда мой код работает на моем рабочем столе, но падает на удаленном кластере. Я потратил бесчисленное количество раз, проверяя мой код курса на наличие ошибок, запуская его в отладчике, чтобы отследить то, что нарушает код, и выискивая утечки памяти в valgrind (который оказался чистым — по крайней мере, в gcc).
В конечном итоге я обнаружил, что один и тот же исходный код выдает идентичные файлы на обеих машинах, если я использую один и тот же компилятор (gcc 4.4.5). Проблема в том, что я хочу использовать компилятор Intel на удаленном кластере для лучшей производительности, а также некоторые готовые библиотеки, которые используют Intel. Кроме того, я все еще беспокоюсь, что, возможно, gcc игнорирует некоторые проблемы с памятью, которые обнаруживаются в компиляторе Intel.
Что это значит для моего кода?
Это, вероятно, означает, что вы полагаетесь на неопределенное, неопределенное или определяемое реализацией поведение.
Возможно, вы забыли инициализировать переменную, или вы обращаетесь к массиву за пределами его допустимых границ, или у вас есть выражения типа a[i] = b[i++]
в вашем коде … возможности практически безграничны.
Вызывает ли сбой основной файл? Если обратные трассировки, эквивалентные команде gdb ‘bt’, из нескольких дампов ядра согласованы, то вы можете начать выборочно вводить операторы printf и работать в обратном порядке вверх по списку функций в трассировке стека.
Если утечки памяти не обнаружены, значит, с кучей все в порядке. Это оставляет стек как потенциальную проблемную область. Похоже, у вас может быть неинициализированная переменная, которая ломает стек.
Попробуйте скомпилировать ваше приложение с помощью ‘-fstack-protector’, включенного в аргументы команды компиляции gcc / g ++.