2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 10:48 
Аватара пользователя
Из проекта в проект использую старые прграммы чтения и записи PNG файлов. Без особых проблем.
Сейчас столкнулся с непреодолимым тупиком.
В моде Release отладка (да и без) программа затыкается на
Код:
if (!png_check_sig(pbSig, 8)) {
        fclose(stream);
        throw CError("ReadFilePNG: invalid PNG signature");
   }


В моде Debug все проходит на ура.
Что делать ума не приложу.
Может есть какие соображения?
Заранее спасибо за помощь.

PS Может быть наводкой:
Ставлю метку остановки перед чтением
Код:
fread(pbSig, 1, 8, stream);

Но дебагер сразу выходит на исключение не останавливаясь. Что-то в коде не то...

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 13:01 
Аватара пользователя
Как я понял, проблема выходит за пределы означенной темы. Это проблема компилятора и линковщика билдера MS VS 2019.
Формально, на момент первого чтения программа ничем не отличается от множества моих, да и просто учебных программ написанных в этой среде.
То есть исполнительный бинарный код, следующий по порядку за открытием файла, каким-то образом портит именно этот код. Возможно, какие-то ощибки в коде (плохо отслеживаемые) и сущесвовали ранее, без последствий. Однако оптимизация кода сделала код не тестируемым. В моде Release затыкается там, где этого не может быть в принципе. Но в этой моде невозможно что-то отследить по существу, кроме условных мест сбоев (часто никак не связанных ни с чем реальным).

Возможно, пора менять стиль программирования новых проектов, но возраст не дает такого шанса.

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 15:17 
MGM в сообщении #1581690 писал(а):
Что делать ума не приложу.
Используйте метод половинного коммента: вырезайте примерно половину программы, проверяйте осталась ли проблема, если осталась — вырезайте дальше, если нет — проблема в вырезанном участке. Это трудоёмко, но ничего не поделаешь.

-- 15.02.2023, 16:20 --

Также надо подебажить дизассеммблером — возможно что-то станет понятно и поотлаживать вставками отладочной печати/логирования.

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 15:58 
К сказанному warlock66613 и добавить особо нечего. Замечу только, что ошибки в компиляторе крайне маловероятны, вот это предположение
MGM в сообщении #1581701 писал(а):
Возможно, какие-то ощибки в коде (плохо отслеживаемые) и сущесвовали ранее, без последствий.
выглядит наиболее правдоподобным.

-- Ср фев 15, 2023 16:07:31 --

Также в Visual Studio можно в настройках проекта для любой конфигурации, в т.ч. "Release", отключить оптимизацию для упрощения отладки.

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение15.02.2023, 16:22 
Аватара пользователя
MGM в сообщении #1581701 писал(а):
Это проблема компилятора и линковщика билдера MS VS 2019.


У вас опять "компилятора виноват", как было в "true(204)"...

Нет, "проблемы компилятора и линковщика" тут исчезающе маловероятны. Вы что-то сами накосячили в коде.

MGM в сообщении #1581690 писал(а):
Ставлю метку остановки перед чтением ... Но дебагер сразу выходит на исключение не останавливаясь.


Так бывает в коде, скомпилированном в Release конфигурации. Это ничего не значит.

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 18:23 
Аватара пользователя
TheRuinedMap в сообщении #1581716 писал(а):
MGM в сообщении #1581701 писал(а):
Это проблема компилятора и линковщика билдера MS VS 2019.


У вас опять "компилятора виноват", как было в "true(204)"...

Нет, "проблемы компилятора и линковщика" тут исчезающе маловероятны. Вы что-то сами накосячили в коде.

Вопрос в том, где косяк? А главное, как этот косяк искать.
Попробую повторить вопрос.
Код до затыка:
Код:
int main(int argc, char **argv) {

   float lp = atof(argv[1]);
   float lm = atof(argv[2]);
        int X, Y, CH;
   char* im_name0 = concat(argv[3], "input_Cam040.png");
   BYTE * im0 = readImageBf(im_name0, &X, &Y, &CH); delete[] im_name0;


Функция чтения PNG файлов, взятая целиком с проверенного ресурса:
BYTE * im0 = readImageBf(im_name0, &X, &Y, &CH);
качует из одного проекта в другой лет 15ть. Никогда никаких сбоев.
Если вставить внутри функции cout << im_name0 печатает то, нужное имя.
По всем классическим канонам программирования ошибка кода должна быть до этой функции. А не после.
Вот в чем проблема.
Тем более, что в Дебаге все открывается. А значит не вероятность того, что проблема в самом PNG файле не очень правдоподобна.

Может быть что-то с командной строкой?
У меня при копировании LateX проектов в Overleaf - если проект на кириллице - возникают фонтомные символы, которые трудно отлавливаемые.
Даже не знаю, что и думать - карма какя-то с текстами. :)

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 19:12 
Откуда вы берёте функцию concat? Вообще, при такой работе с сырыми указателями очень легко ненароком испортить память, что может привести к непредсказуемым последствиям при дальнейшем выполнении программы.

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 19:15 
Аватара пользователя
Вроде бы нащупал лик.
Вот этот модуль взял с непроверенного ресурса, до сих пор работал нормально.
Код:
char* concat(const char *s1, const char *s2)
{
   char *result = new char[(strlen(s1) + strlen(s2)+1)];//+1 for the null-terminator
                                        
   strcpy(result, s1);
   strcat(result, s2);
   return result;
}

А сейчас хоть и выдает правильную строку, но в режиме Release крутится по нескольку раз и портит код.
Что в этой функции не так?

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 20:50 
MGM в сообщении #1582222 писал(а):
крутится по нескольку раз и портит код.
Что значит?
"readImageBf" внутри не запоминает ссылку на строку?
"argv[3]" там точно есть третий аргумент? Можно для надёжности "argc" проверять.

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 21:39 
Аватара пользователя
MGM в сообщении #1582222 писал(а):
Что в этой функции не так?


Все в ней в порядке, кроме разве что побочных придирок к реализации. Но реальных проблем в ней нет.

MGM в сообщении #1582222 писал(а):
Вроде бы нащупал лик.


Какой "лик"? В том коде, который вы приводили ранее, выделенная этой функцией память честно освобождалась вызывающим кодом. Именно на такой способ использования эта функция и рассчитана.

MGM в сообщении #1582222 писал(а):
но в режиме Release крутится по нескольку раз и портит код.


О каком "портит код" вы ведете речь? Что это вообще значит - "портит код"?

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 22:06 
Аватара пользователя
TheRuinedMap в сообщении #1582252 писал(а):

MGM в сообщении #1582222 писал(а):
но в режиме Release крутится по нескольку раз и портит код.


О каком "портит код" вы ведете речь? Что это вообще значит - "портит код"?

Так как мода Release, то процесс дебага становится нелогичным.

Но не суть. После нескольких экспериментов по переделке кода и возврата к старой версии я вдруг обнаружил следующее:

Код:
int main(int argc, char **argv) {

   cout << argv[1] << endl;

Выдает цифру 140 при моде Release
и d:/IF/full_data/training/cotton/ при моде Debug

Последнее соответсвует первому аргументу командной строки.

То есть полный атас. Понять, почему строка аргумента неверна сразу же после входа для меня непосильная задача.

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение18.02.2023, 23:06 
Надо было "argc" проверять.
Перед "float lp" вставить
Используется синтаксис C++
if(argc < 4) {printf("error\n"); return -1;}


-- 18.02.2023, 23:10 --

MGM в сообщении #1582260 писал(а):
Выдает цифру 140 при моде Release
и d:/IF/full_data/training/cotton/ при моде Debug

Последнее соответсвует первому аргументу командной строки.
Кто знает, как вы их задаёте...
Может в IDE как-то, как параметр проекта. И задали по-разному.

Сделайте EXE файл и запустите его в консоли, задавая нужные аргументы.

 
 
 
 Re: Чтение PNG файла. Отладочный тупик
Сообщение19.02.2023, 02:27 
Аватара пользователя
MGM в сообщении #1582260 писал(а):
Выдает цифру 140 при моде Release
и d:/IF/full_data/training/cotton/ при моде Debug


Ну так небось вы из-под IDE запускаетесь, и в IDE именно такие параметры и прописаны: для Release "140", а для Debug "d:/IF/full_data/training/cotton/"

 
 
 [ Сообщений: 13 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group