23 сентября 2019

Delphi & Linux. "Project raised exception class Segmentation fault (11)"

    Проверил новую версию программы под Windows - все работает нормально. Сразу делаю релизный билд под Linux, запускаю и получаю ошибку "Project XYZ raised exception class Segmentation fault (11)". Как это? Что это?
    Запускаю программу под отладкой под Linux и нахожу виновника ошибки. Им оказывается метод определения кодировки:
var
  baBuffer: TBytes;
  Encoding: TEncoding;
...
  TEncoding.GetBufferEncoding(baBuffer, Encoding);
    Паника... Паника... Рабочий день уже давно закончен... Пятница... А ведь уже собрался выходить домой...
    Паника... Паника... Под Windows же все работало... И черт меня дернул проверить версию под Linux, проверил бы в понедельник... Скорее всего виноваты кривые руки разработчиков Delphi, и метод GetBufferEncoding просто не работает под Linux... Смотрю реализацию GetBufferEncoding - никакой зависимости от операционной системы. Так... Руки разработчиков Delphi реабилитированы...
    Паника... Паника... Все .NET-разработчики уже ушли и я в офисе один, как дурак со своим Delphi и Linux... Запускаю отладку под Linux снова... и сползаю со стула - в переменной Encoding уже есть какой-то адрес. Кто ты? А в ответ тишина - мусор по данному адресу разговаривать со мной отказывается. Метод GetBufferEncoding не только возвращает результат в переменную Encoding, но и использует ее для определения кодировки, если она имеет значение отличное от nil. Под Windows компилятор инициализировал переменную Encoding пустым указателем сам, а под Linux оказывается это нужно было сделать программисту.
    В том, что я не инициализировал переменную Encoding пустым указателем я, конечно, не виноват. Логично, что виноват компилятор Delphi под Linux - никакой заботы об удобстве программиста!

    Баг исправлен. Виновные назначены. Можно спокойно идти домой.

Комментариев нет:

Отправить комментарий