MAP-файлы

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

MAP-файлы

Сообщение unC0Rr »

Здравствуйте! Я столкнулся с такой проблемой: программа компилируется и работает в Delphi, но при компиляции фрипаскалем творится нечто странное: 1) в одной из процедур происходит переполнение стека... размер стека я увеличил, программа вроде бы идёт дальше, но! 2) где-то она зацикливается... проблема в том, что я никак не могу выяснить это место: программу запустить из-под дебагера не получится, из-за сложного взаимодействия с другим процессом при запуске. С помощью аттача к этому процессу из Delphi я узнал адреса инструкций, по которым бегает зацикленная программа. Но! По этим адресам не могу сказать в какой я функции нахожусь, потому что .map файлы фрипаскаль похоже не умеет генерировать (в документации и интернете ничего по вопросу не нашёл). Пробовал аттачиться при помощи gdb, но он всплывает где-то в недрах ntdll (как и Delphi в общем-то) и дотрейсить до самой программы похоже невозможно, или терпения не хватает ;)
Подскажите, как быть! Для счастья мне хватило бы map.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

-k-Map -kmy_super_map.map в командной строке должно помочь. my_super_map.map - это имя создаваемого файла...
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

Сообщение unC0Rr »

Большое спасибо! карта действительно помогла.... узнать, что зацикливание происходит в недрах RTL... а именно, SYSTEM_READNUMERIC$TEXT$openshortstring... где-то тут кроются глюки фрипаскаля....
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Кстати говоря... Недавно был багрепорт http://www.freepascal.org/mantis/view.php?id=7010, связанный с чтением данных из файлов. Автор утверждал, что глюки появлялись только на определенных процессорах. Однако ж пока вопрос повис в воздухе. Поэтому, если удастся локализовать неправильно работающий кусок программы - это могло бы оказать неоценимую услугу всем ;)
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

Сообщение unC0Rr »

Я нашёл, где проблема...

Код: Выделить всё

Read(f, x, y, w, h);
f - файл, остальные переменные - числа. Бинарник зацикливается "внутри" этой строчки, если нет перехода на новую строку (символа конца файла тоже нет). Не знаю, зависит ли от процессора, у меня PIV.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

А немного подробнее можно, если не затруднит? Т.е. какие числа (целые, вещественные или вперемешку)? Файл многострочный? Если да, то какие там концы строк (DOS/UNIX)? Какие версии FPC и операционки?
unC0Rr
новенький
Сообщения: 59
Зарегистрирован: 02.02.2006 02:44:44

Сообщение unC0Rr »

Числа все целые, написаны каждое через один пробел, файл многострочный, зацикливается именно на последней строке, концы строк DOS, FPC 2.0.0, WinXP
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

Вообще, со времен FPC 2.0.0 исправлено уже довольно много багов. В том числе есть и исправление в ф-ции NextChar, которая вызвается в цикле из ReadNumeric. Так что я бы порекомендовал апгрейд до 2.0.2 или даже 2.0.3 - чем черт не шутит...
vay
новенький
Сообщения: 22
Зарегистрирован: 06.07.2009 17:56:46

Сообщение vay »

такой вопрос, у меня fpc 2.2.4, в командую строку сборки проекта добавляю -k-Map -kmap.map , но никакого map.map не появляется, а тот который генерируется с ключем -Xm - не имеет информации о адресах строк в коде, чтобы адекватно увязать адрес exception. (из call stack)

Не посоветуете какого либо решения для получения именно номеров строк? Заранее спасибо.
Ответить