吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 244|回复: 5
上一主题 下一主题
收起左侧

[其他原创] 调试Lazarus源码F7进入不了排查过程记录

[复制链接]
跳转到指定楼层
楼主
lrj2025kernel 发表于 2026-8-22 11:35 回帖奖励
本帖最后由 lrj2025kernel 于 2026-8-22 15:32 编辑

一、新建一个Lazarus项目,在CreateForm处下断点,F7追踪

发现跟踪到下图后F7进入不了Create(其实我想跟踪到最根上TObject),直接到了下一句



二、看到这种现象后,想着从源码重新构建一个调试版本(编译器、Lazarus IDE等都从源码构建)方便查看底层,先给一个总图:

三、总体分两大块构建编译器FPC、构建Lazarus IDE,它们的目录结构如图:
简洁版:

详细版:

四、编译总图于运行依赖总图

五、这些源码目录中有很多文件,以下是对重要文件拓展名解释

六、构建编译器FPC,采用“自举”(Bootstrap)过程——即用旧编译器编译出新编译器,经典自举如图

一个常见的实践是,用一个稍早版本(例如 3.0.x)来首次编译 3.2.2,一旦成功,后续就可以用编译出的新版 3.2.2 来“自举”编译,这里官方直接推荐用FPC3.2.2做引导编译器

七、构建空目录

上图位FPC目录:output存储编译结果,带调试符号的FPC,source存储FPC源代码,tools作为FPC3.2.2做引导编译器的安装目录,里面有make.exe工具

上图位lazarus源码位置
八、准备FPC3.2.2安装包、FPC3.2.2源码,双击安装包选择到fpc/tools目录安装,解压压缩文件至fpc/source,如图:

九、编译 Debug FPC + RTL,执行这行指令除了编译FPC以外,也包含了对RTL的编译


以上命令选项相关解释:

DWAF信息是什么?其实就是调试信息(注意下图中的DWARF是嵌入到.O文件中的)



十、编译完成安装FPC至fpc/output目录,安装后output目录有了内容


生成的bin目录中并没有make.exe,记得将fpc/tools/make.exe剪切过去,这样make的时候调用的才是新的fpc.exe,否则调用的还是旧的
十一、生成FPC全局配置文件fpc.cfg,这个文件是编译器启动时自动加载的一组默认编译参数,主要作用是告诉PFC去哪里找库

安装完成后,在fpc.exe同目录会生成一个fpc.cfg的文件,此文件里面的路径要稍作修改,否则lazarus使用的时候会报错


十二、以上是FPC编译过程,用已经安装好的 FPC 编译器,重新生成 Lazarus IDE(lazarus.exe)以及它依赖的 LCL、Packages 等单元,总体编译图如下

十三、开始编译,开始编译前clean一下,且注意看一下make的位置是否为刚刚新生成fpc目录内

编译完成后

十四、第一次启动需要配置一下目录


再次检查路径

十五、设置IDE为调试类型的IDE,这里选择后直接保存设置即可,无需构建(因为我们前面已经用新的fpc.exe构建过了

十六、在文章起始提到的位置下断点,F7追踪,最终发现可追踪到TObject

十七、补充:以上是FPC编译器与LazarusIDE都从源码构建,如果只是想跟踪的底层其实只需要构建FPC即可,IDE用二进制安装包直接安装(其实里面含有了源代码),然后通过界面中的构建Lazarus重新构建即可

这里的构建过程是:调用新生成的FPC.EXE将lazarus及其相关模块重新构建一遍,与上面的命令行构建方式本质相同

image.png (13.5 KB, 下载次数: 0)

生成配置文件

生成配置文件

image.png (13.66 KB, 下载次数: 0)

开始编译

开始编译

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
冥界3大法王 发表于 2026-8-22 12:22
后来又当如何了。。。
3#
 楼主| lrj2025kernel 发表于 2026-8-22 12:23 |楼主
4#
xuanle 发表于 2026-8-22 13:10
是不是热键不一样,Delphi中是可以进入到

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
  Instance: TComponent;
begin
  // Set flag that TCustomForm constructor can read, so it knows if it's being
  // created as a main form or not (required when MainFormOnTaskbar is True)
  FCreatingMainForm := (FMainForm = nil) and InstanceClass.InheritsFrom(TForm);
  Instance := nil;
  try
{$IF DEFINED(CLR)}
    Instance := InstanceClass.Create(Self);
    Reference := Instance;
{$ELSE}
    Instance := TComponent(InstanceClass.NewInstance);
    TComponent(Reference) := Instance;
    try
      Instance.Create(Self);
    except
      TComponent(Reference) := nil;
      Instance := nil;
      raise;
    end;
{$ENDIF}

    if (FMainForm = nil) and (Instance is TForm) then
    begin
      TForm(Instance).HandleNeeded;
      FMainForm := TForm(Instance);
      if MainFormOnTaskBar then
        SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
      ChangeAppWindow(Handle, not MainFormOnTaskBar, not MainFormOnTaskBar);
    end;
  finally
    if (FMainForm = nil) and (Instance is TForm) then
      TForm(Instance).FCreatingMainForm := False;
  end;
end;
5#
 楼主| lrj2025kernel 发表于 2026-8-22 15:24 |楼主
xuanle 发表于 2026-8-22 13:10
是不是热键不一样,Delphi中是可以进入到

procedure TApplication.CreateForm(InstanceClass: TComponen ...

这里倒是能进去,我想进入TObject进不去了
6#
AnnaKozey 发表于 2026-8-22 16:22
学习了,现在用 lazarus 的太少了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-8-23 07:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表