Пути к файлам в отладочной инфе

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

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

Re: Пути к файлам в отладочной инфе

Сообщение Лекс Айрин » 11.05.2017 19:22:48

Mirage писал(а):Особенно, если учесть, что базой является директория, в которой запускался компилятор. Т.е. некая сиюминутная инфа, которая утрачивается сразу же.


Т. е., ты хочешь чтобы вся инфа выставлялась в абсолютных путях? И готов мириться если при их изменении программа зависнет?
Стирается инфа о стандартных (предустановленных) компонентах, которая обычному пользователю как бы и не нужна.А все остальные файлы должны искаться по путям отсчитывающимся от файла проекта.

Mirage писал(а):Возможно, можно как-то вытащить базу из экзешника, но не видел такого.


Добавь (напиши) пакет, который проставляет пути до использованных при компиляции файлов... только готовься к простыне, которая легко может включить половину стандартных файлов, для примера типа "Привет Мир!". И не советую включать эту инфу в экзешник -- его размер сильно подрастет((
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Пути к файлам в отладочной инфе

Сообщение Mirage » 12.05.2017 16:00:12

Лекс Айрин писал(а):Т. е., ты хочешь чтобы вся инфа выставлялась в абсолютных путях? И готов мириться если при их изменении программа зависнет?


Напомню, речь все еще про пути к исходным файлам в отладочной информации. :)
Как и зачем их изменить после компиляции и почему при этом программа зависнет?
Mirage
энтузиаст
 
Сообщения: 752
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Пути к файлам в отладочной инфе

Сообщение Лекс Айрин » 12.05.2017 17:39:48

Mirage писал(а):Как и зачем их изменить после компиляции и почему при этом программа зависнет?


Как на палец подуть. Можно тупо перенести папку компилятора в другое место (переименовать). И на программу они никак не могут повлиять, но тогда сообщения будут лгать... и смысл в них пропадет.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Пути к файлам в отладочной инфе

Сообщение Mirage » 12.05.2017 19:03:23

Еще раз - пути в отладочной инфе заданы относительно текущей директории при запуске компилятора. Не директории, в которой сам компилятор расположен. Т.е. если FPC в /opt/fpc, но для компиляции перешел в директорию /home/me и оттуда вызвал /opt/fpc/bin/fpc, то базой будет /home/me.
Т.е. база известна на момент запуска команды компиляции. А далее канет в лету, если конечно не сохраняется где-нибудь в екзешнике.
А перенос компилятора не повлияет ни на что. Вот перенос исходников повлияет. Но одинаково в случае относительных и абсолютных путей. ССЗБ.
Mirage
энтузиаст
 
Сообщения: 752
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Пути к файлам в отладочной инфе

Сообщение Лекс Айрин » 12.05.2017 19:27:16

Mirage писал(а):Вот перенос исходников повлияет.


это уже моно... в общем, роли не играет, так как исходники ftl, фактически, это часть компилятора. И периодически обновляются.
Mirage писал(а):Т.е. база известна на момент запуска команды компиляции. А далее канет в лету, если конечно не сохраняется где-нибудь в екзешнике.


Я вообще удивлен, что в экзешнике хранятся хоть какие-то пути. Так как это данные нужные только на этапах написания и компиляции программы. Для работы программы они лишние. Названия файлов, согласен, могут заинтересовать, а вот путь до них нет. В принципе, все это могло бы лежать в одной куче (папке) и это не играло бы никакой роли.
И, кстати, вполне очевидно считать, базой путь от рабочей папки компилятора. Мы же собираемся компилировать программу. Все остальные действия (подключение и компиляция пакетов и библиотек) нас интересуют постольку поскольку.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Пути к файлам в отладочной инфе

Сообщение Mirage » 12.05.2017 22:50:58

Лекс Айрин писал(а):Так как это данные нужные только на этапах написания и компиляции программы.


А отладчик как будет сообщать на какой строке исходников отладка идет? Как тот же heaptrc покажет стектрейс где утечка памяти? Как вообще стектрейсы при ошибках показывать?
Начало топика забылось уже?
Mirage
энтузиаст
 
Сообщения: 752
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Пути к файлам в отладочной инфе

Сообщение Лекс Айрин » 13.05.2017 12:45:17

Mirage писал(а):А отладчик как будет сообщать на какой строке исходников отладка идет?


а для этого в самих исходниках сохраняется структура программы вместе с номерами строк и операторами... т. е. фактически текст программы "размазан" по исполнимому файлу. Для подтверждения этого факта можешь откомпилировать с ассемблерным текстом.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Пути к файлам в отладочной инфе

Сообщение zub » 15.05.2017 11:14:33

Лекс Айрин
Ниче нигде не размазано. Единственное что связывает откомпилированный и исходный код это отладочная информация.
zub
долгожитель
 
Сообщения: 2206
Зарегистрирован: 14.11.2005 23:51:26

Re: Пути к файлам в отладочной инфе

Сообщение Лекс Айрин » 15.05.2017 11:40:52

zub, ну не размазано. Но, тем не менее связь, как я понимаю, однозначная.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4021
Зарегистрирован: 19.02.2013 16:54:51

Re: Пути к файлам в отладочной инфе

Сообщение zub » 15.05.2017 14:32:40

Mirage
У себя в винде я вижу относительные пути, только базы везде разные
например
Код: Выделить всё
  $0043E5DF  REMAPMEMEMBLOCK,  line 206 of uzbmemman.pas
  $0063A61A  GZVECTOR$1$CRC0969EAE6__SHRINK,  line 451 of gzctnrvector.pas
  $006411E6  ZGLGEOMDATA__SHRINK,  line 64 of ./zengine/zgl/uzglgeomdata.pas

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

Думаю это всё зависит от того в каком виде скормить компилятору пути поиска, хотя не проверял. т.е. если вбить в настройку компилятора абсолютные пути поиска чегото, то в отл. инфу это чтото выскочит с абсолютными путями.

Кроме того файлы LCL и RTL и пакетов по идее уже скомпилированы, и попадают в отладочную информацию с теми путями которые были настроены на момент их компиляции
zub
долгожитель
 
Сообщения: 2206
Зарегистрирован: 14.11.2005 23:51:26

Re: Пути к файлам в отладочной инфе

Сообщение Mirage » 16.05.2017 03:10:46

zub: если там базы разные, то собрать потом абсолютный путь в общем случае невозможно. Это уже баг получается.
В директории, где лежит uzbmemman.pas есть директория zengine/ и там исходники пакета? Ведь "./zengine/..." это тоже самое что и "zengine/..."
Или для пакетов какой-то особый алгоритм получается?

Про пути из скомпилированных ppu хорошее замечание. Там база полюбому своя, причем хз какая. Компилировалось-то вообще на другом компе. Тут относительные пути оправданы - хоть какая-то возможность восстановить абсолютный путь. Потому этот инклуд (system.inc) имел такой странный путь.

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

Хотя нет, почему на другом. Это ж не Delphi, тут RTL на своем обычно компилируется. Так что все больше склоняюсь к тому, что относительные пути в отладочной инфе это косяк.
Mirage
энтузиаст
 
Сообщения: 752
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Пути к файлам в отладочной инфе

Сообщение zub » 16.05.2017 04:49:59

>>В директории, где лежит uzbmemman.pas есть директория zengine/ и там исходники пакета?
нет.
он входит в пакет zebase и лежит в E:zcadcad_sourcecomponentszebaseuzbmemman.pas
а zengine это исходники проекта, не пакет, E:zcadcad_sourcezenginezgluzglgeomdata.pas

Попробовал - да, пути преобразуются в относительные, даже если задать их абсолютно. Преобразуются относительно папки где запущен fpc, обычно это папка с главным файлом проекта, но не факт

тестовый проект
Код: Выделить всё
program project1;

uses Unit1, Unit2;

begin
  makeleak1;
  makeleak2;
end.

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

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

procedure makeleak1;

implementation

procedure makeleak;
begin
  getmem(100);
end;

procedure makeleak1;
begin
  writeln('1');
  makeleak;
end;

end.

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

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

procedure makeleak2;

implementation

procedure makeleak;
begin
  getmem(200);
end;

procedure makeleak2;
begin
  writeln('2');
  makeleak;
end;

end. 

unit1 в подпапке rel, unit2 в подпапке abs

компиляция из основной папки
E:zcadothertest>fpc project1.lpr -gh -g -gl -Furel -FuE:zcadothertestabs
Free Pascal Compiler version 3.1.1 [2017/04/23] for i386
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling project1.lpr
Compiling .relunit1.pas
Compiling .absunit2.pas
Linking project1.exe
62 lines compiled, 0.1 sec, 161808 bytes code, 6980 bytes data

E:zcadothertest>E:zcadothertestproject1.exe
Heap dump by heaptrc unit
67 memory blocks allocated : 1959/2096
65 memory blocks freed : 1659/1792
2 unfreed memory blocks : 300
True heap size : 229376 (96 used in System startup)
True free heap : 228832
Should be : 228848
Call trace for block $002120F0 size 200
$0041316F MAKELEAK2, line 22 of ./abs/unit2.pas
$004016B3 main, line 7 of project1.lpr
Call trace for block $001FA188 size 100
$0041310F MAKELEAK1, line 22 of ./rel/unit1.pas
$004016AE main, line 6 of project1.lpr


компиляция из папки уровнем выше обломалась изза относительного пути
E:zcadother>fpc testproject1.lpr -gh -g -gl -Furel -FuE:zcadothertestabs
Free Pascal Compiler version 3.1.1 [2017/04/23] for i386
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling testproject1.lpr
project1.lpr(3,6) Fatal: Can't find unit Unit1 used by project1
Fatal: Compilation aborted
Error: E:ppbini386-win32ppc386.exe returned an error exitcode


компиляция из папки уровнем выше, относительный путь исправлен на абсолютный
E:zcadother>fpc testproject1.lpr -gh -g -gl -FuE:zcadothertestrel -FuE:zcadothertestabs
Free Pascal Compiler version 3.1.1 [2017/04/23] for i386
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling testproject1.lpr
Compiling .testrelunit1.pas
Compiling .testabsunit2.pas
Linking testproject1.exe
62 lines compiled, 0.1 sec, 161808 bytes code, 6980 bytes data

E:zcadothertest>E:zcadothertestproject1.exe
Heap dump by heaptrc unit
67 memory blocks allocated : 1959/2096
65 memory blocks freed : 1659/1792
2 unfreed memory blocks : 300
True heap size : 229376 (96 used in System startup)
True free heap : 228832
Should be : 228848
Call trace for block $016520F0 size 200
$0041316F MAKELEAK2, line 22 of ./test/abs/unit2.pas
$004016B3 main, line 7 of test/project1.lpr
Call trace for block $0163A188 size 100
$0041310F MAKELEAK1, line 22 of ./test/rel/unit1.pas
$004016AE main, line 6 of test/project1.lpr


Добавлено спустя 26 минут 3 секунды:
Имхо относительные пути вполне логичны - да, может возникнуть путаница при одинаковых именах, но зато исходники легко переместить. Наверно лазарус например при сработве точки останова зная папку пректа и все папки подключеных пакетов просто перебирает их в качестве базы пока не найдет файл
Например в техже patch`ах тоже относительные пути, и ниче, все их применяют на свои локальные копии исходников расположеные по разным путям.
zub
долгожитель
 
Сообщения: 2206
Зарегистрирован: 14.11.2005 23:51:26

Re: Пути к файлам в отладочной инфе

Сообщение Дож » 17.05.2017 23:13:06

Например в техже patch`ах тоже относительные пути, и ниче, все их применяют на свои локальные копии исходников расположеные по разным путям.

Нельзя сравнивать. patch 1) работает с одним деревом файлов, начиная с текущей директории 2) предназначен для того, чтобы применять диффы, построенные в другом месте.

fpc работает не с одним деревом, а с набором (и это приводит к неоднозначности относительных путей), и на пути не накладывается ограничения, что они потребуются в других местах, отличных от исходных.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 664
Зарегистрирован: 12.10.2008 16:14:47

Re: Пути к файлам в отладочной инфе

Сообщение zub » 18.05.2017 03:14:48

>>и на пути не накладывается ограничения, что они потребуются в других местах, отличных от исходных.
Ну как не накладывается? емнип например в установке лазаря уже скомпиленые файлы, и отладка работает без перекомпиляции.
zub
долгожитель
 
Сообщения: 2206
Зарегистрирован: 14.11.2005 23:51:26

Re: Пути к файлам в отладочной инфе

Сообщение Дож » 18.05.2017 05:23:41

Ну как не накладывается? емнип например в установке лазаря уже скомпиленые файлы, и отладка работает без перекомпиляции.

Так разве скомпиленному ppu'шнику нужны какие-то пути (кроме путя до себя самого)?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 664
Зарегистрирован: 12.10.2008 16:14:47

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru