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

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

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

Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


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

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


Добавь (напиши) пакет, который проставляет пути до использованных при компиляции файлов... только готовься к простыне, которая легко может включить половину стандартных файлов, для примера типа "Привет Мир!". И не советую включать эту инфу в экзешник -- его размер сильно подрастет((
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

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


Напомню, речь все еще про пути к исходным файлам в отладочной информации. :)
Как и зачем их изменить после компиляции и почему при этом программа зависнет?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


Как на палец подуть. Можно тупо перенести папку компилятора в другое место (переименовать). И на программу они никак не могут повлиять, но тогда сообщения будут лгать... и смысл в них пропадет.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Еще раз - пути в отладочной инфе заданы относительно текущей директории при запуске компилятора. Не директории, в которой сам компилятор расположен. Т.е. если FPC в /opt/fpc, но для компиляции перешел в директорию /home/me и оттуда вызвал /opt/fpc/bin/fpc, то базой будет /home/me.
Т.е. база известна на момент запуска команды компиляции. А далее канет в лету, если конечно не сохраняется где-нибудь в екзешнике.
А перенос компилятора не повлияет ни на что. Вот перенос исходников повлияет. Но одинаково в случае относительных и абсолютных путей. ССЗБ.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


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


Я вообще удивлен, что в экзешнике хранятся хоть какие-то пути. Так как это данные нужные только на этапах написания и компиляции программы. Для работы программы они лишние. Названия файлов, согласен, могут заинтересовать, а вот путь до них нет. В принципе, все это могло бы лежать в одной куче (папке) и это не играло бы никакой роли.
И, кстати, вполне очевидно считать, базой путь от рабочей папки компилятора. Мы же собираемся компилировать программу. Все остальные действия (подключение и компиляция пакетов и библиотек) нас интересуют постольку поскольку.
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

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


А отладчик как будет сообщать на какой строке исходников отладка идет? Как тот же heaptrc покажет стектрейс где утечка памяти? Как вообще стектрейсы при ошибках показывать?
Начало топика забылось уже?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


а для этого в самих исходниках сохраняется структура программы вместе с номерами строк и операторами... т. е. фактически текст программы "размазан" по исполнимому файлу. Для подтверждения этого факта можешь откомпилировать с ассемблерным текстом.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Лекс Айрин
Ниче нигде не размазано. Единственное что связывает откомпилированный и исходный код это отладочная информация.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zub, ну не размазано. Но, тем не менее связь, как я понимаю, однозначная.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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 и пакетов по идее уже скомпилированы, и попадают в отладочную информацию с теми путями которые были настроены на момент их компиляции
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

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

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

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

Хотя нет, почему на другом. Это ж не Delphi, тут RTL на своем обычно компилируется. Так что все больше склоняюсь к тому, что относительные пути в отладочной инфе это косяк.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>В директории, где лежит 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`ах тоже относительные пути, и ниче, все их применяют на свои локальные копии исходников расположеные по разным путям.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

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

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

fpc работает не с одним деревом, а с набором (и это приводит к неоднозначности относительных путей), и на пути не накладывается ограничения, что они потребуются в других местах, отличных от исходных.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>и на пути не накладывается ограничения, что они потребуются в других местах, отличных от исходных.
Ну как не накладывается? емнип например в установке лазаря уже скомпиленые файлы, и отладка работает без перекомпиляции.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

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

Так разве скомпиленному ppu'шнику нужны какие-то пути (кроме путя до себя самого)?
Ответить