Razhroščevanje

Navodila za razhroščevanje WvdS FPC RAD Studio razširitev in aplikacij.

Razhroščevalno beleženje

Dvostopenjska aktivacija

Razhroščevalno beleženje zahteva dva pogoja:

  1. Čas prevajanja: Prevajanje z -dDEBUG
  2. Čas izvajanja: Zagon razširitve s parametrom –debug
{$IFDEF DEBUG}
procedure LogDebugTrace(const AMessage: string; const AArgs: array of const);
begin
  if not DebugEnabled then Exit;
  WriteToDebugLog(Format('[%s] %s', [
    FormatDateTime('hh:nn:ss.zzz', Now),
    Format(AMessage, AArgs)
  ]));
end;
{$ENDIF}

Dnevniška datoteka

  • Format: debug-yymmddhhnnss.log
  • Lokacija: ~/binaries/logs/
  • Nikoli ne potrjujte v ~/sources/

MS format sledenja izjem

Za podrobno razhroščevanje s skladom klicev:

procedure LogDebugTrace(const AMessage: string; const AArgs: array of const);
var
  CallStack: string;
begin
  {$IFDEF DEBUG}
  if not DebugEnabled then Exit;
 
  (* Sklad klicev z get_caller_frame / get_frame *)
  CallStack := GetCallStackTrace;
 
  WriteToDebugLog(Format(
    '[%s] %s'#13#10 +
    '   at %s'#13#10 +
    '   Parameters: %s',
    [
      FormatDateTime('yyyy-MM-dd hh:nn:ss.zzz', Now),
      Format(AMessage, AArgs),
      CallStack,
      FormatParams(AArgs)
    ]
  ));
  {$ENDIF}
end;

Pomočnik za sklad klicev

function GetCallStackTrace: string;
var
  Frame: Pointer;
  Addr: Pointer;
  Info: string;
begin
  Result := '';
  {$IFDEF DEBUG}
  Frame := get_frame;
  while Frame <> nil do
  begin
    Addr := get_caller_addr(Frame);
    Info := BackTraceStrFunc(Addr);  (* Format Unit:Line *)
    if Info <> '' then
      Result := Result + '   at ' + Info + #13#10;
    Frame := get_caller_frame(Frame);
  end;
  {$ENDIF}
end;

Primer dnevniške datoteke

================================================================================
DEBUG LOG: debug-260112143022.log
Started: 2026-01-12 14:30:22.001
================================================================================

[2026-01-12 14:30:22.001] Application started with --debug
   at TWvdSApplication.Initialize(Application.Main.pas:42)
   at program.main(extension_main.pas:398)
   Parameters: (CommandLine='--debug')

[2026-01-12 14:30:22.015] Loading configuration
   at TWvdSToolchainConfigService.LoadFromSettings(Toolchain.ConfigService.pas:156)
   at TWvdSToolchainConfigService.AutoDetectAll(Toolchain.ConfigService.pas:89)
   at DoActivate(extension_main.pas:368)
   Parameters: (ConfigPath='~/.vscode/settings.json')

[2026-01-12 14:30:22.042] Service initialized
   at TWvdSBuildService.Initialize(Build.Service.pas:45)
   at DoActivate(extension_main.pas:370)
   Parameters: (ServiceName='BuildService', Mode=debug)

================================================================================
ERROR TRACE (if any):
================================================================================

[2026-01-12 14:30:24.500] ERROR: File not found
   at ValidateBuildPath(Build.Service.pas:144)
   at GenerateCleanCommand(Build.Service.pas:174)
   at OnBuildClean(extension_main.pas:112)
   Parameters: (Path='~/invalid/path', ValidationResult=False)
   Exception: EFileNotFound
   Message: The specified path does not exist
   Stack Trace:
      Build.Service.ValidateBuildPath(144)
      Build.Service.GenerateCleanCommand(179)
      extension_main.OnBuildClean(112)
      VSCode.Commands.ExecuteCommand(89)
Pomembno: Nikoli ne beležite občutljivih podatkov (žetonov, gesel) v Parameters!

Kaj beležiti?

Dovoljeno Prepovedano
Imena akcij Žetoni, API ključi
Imena datotek/poti Gesla
Sporočila napak ID-ji sej
Konfiguracijski ključi Občutljive vrednosti

Razhroščevanje razširitev VS Code

Extension Development Host

  1. Odprite projekt razširitve v VS Code
  2. Pritisnite F5 ali Run > Start Debugging
  3. Odpre se novo okno VS Code
  4. Razširitev se naloži tam

launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Run Extension",
      "type": "extensionHost",
      "request": "launch",
      "args": [
        "--extensionDevelopmentPath=${workspaceFolder}"
      ],
      "outFiles": [
        "${workspaceFolder}/dist/**/*.js"
      ]
    }
  ]
}

Prelomne točke

Ker je koda transpilirana (Pascal → JavaScript), prelomne točke delujejo samo z izvornimi kartami:

  1. Prevajajte z -Jm (generiranje izvorne karte)
  2. Nastavite prelomne točke v datoteki .pas
  3. VS Code preslika na JavaScript pozicijo

Izhodni kanal

Izhodni kanal WvdS prikazuje sporočila med izvajanjem:

  1. ViewOutput
  2. V spustnem meniju izberite „WvdS“
// V kodi
LogInfo('Informacijsko sporočilo');
LogWarn('Opozorilno sporočilo');
LogError('Napaka: %s', [E.Message]);

Konzola za razvijalce

Za nizkonivojsko razhroščevanje:

  1. HelpToggle Developer Tools
  2. Odprite zavihek Console
  3. Vidne so JavaScript napake in console.log

Pogoste težave

Razširitev se ne zažene

Diagnoza:

# Preverite dnevnike razširitve
code --verbose --log trace

Pogosti vzroki:

  • Sintaksna napaka v generiranem JavaScriptu
  • Manjkajoče odvisnosti v package.json
  • Napačna pot v „main“

Ukaz ne deluje

Diagnoza:

  1. Odprite konzolo za razvijalce
  2. Izvedite ukaz
  3. Preverite napake

Pogosti vzroki:

  • Ukaz ni v contributes.commands
  • Obravnavalnik ni registriran
  • Izjema v obravnavalniku

WebView ne prikazuje ničesar

Diagnoza:

  1. Desni klik v WebView → „Inspect“
  2. Odprejo se brskalniška DevTools

Pogosti vzroki:

  • Napačen HTML
  • CSP blokira vire
  • JavaScript napaka

Profiliranje

Merjenje zmogljivosti

{$IFDEF DEBUG}
var
  StartTime: TDateTime;
 
procedure StartTiming(const AOperation: string);
begin
  StartTime := Now;
  LogDebug('Starting: %s', [AOperation]);
end;
 
procedure EndTiming(const AOperation: string);
begin
  LogDebug('Completed: %s in %d ms', [
    AOperation,
    MilliSecondsBetween(Now, StartTime)
  ]);
end;
{$ENDIF}

Uhajanje pomnilnika

pas2js/JavaScript ima zbiranje smeti, vendar bodite pozorni na:

  • Krožne reference z zaprtji
  • Neodstranjeni obravnavalci dogodkov
  • Velika polja/objekti v pomnilniku

Razhroščevanje testov enot

// Test z razhroščevalnim izhodom
procedure TMyTest.TestFeature;
begin
  {$IFDEF DEBUG}
  LogDebug('Testing with input: %s', [TestInput]);
  {$ENDIF}
 
  Result := ProcessInput(TestInput);
 
  {$IFDEF DEBUG}
  LogDebug('Result: %s', [Result]);
  {$ENDIF}
 
  CheckEquals(Expected, Result);
end;

Glejte tudi

Zuletzt geändert: dne 29.01.2026 ob 22:28