====== 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**:
- **Čas prevajanja:** Prevajanje z ''-dDEBUG''
- **Č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 ====
- Odprite projekt razširitve v VS Code
- Pritisnite ''F5'' ali ''Run > Start Debugging''
- Odpre se novo okno VS Code
- 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:
- Prevajajte z ''-Jm'' (generiranje izvorne karte)
- Nastavite prelomne točke v datoteki .pas
- VS Code preslika na JavaScript pozicijo
===== Izhodni kanal =====
Izhodni kanal WvdS prikazuje sporočila med izvajanjem:
- ''View'' -> ''Output''
- 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:
- ''Help'' -> ''Toggle Developer Tools''
- Odprite zavihek Console
- 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:**
- Odprite konzolo za razvijalce
- Izvedite ukaz
- Preverite napake
**Pogosti vzroki:**
* Ukaz ni v contributes.commands
* Obravnavalnik ni registriran
* Izjema v obravnavalniku
==== WebView ne prikazuje ničesar ====
**Diagnoza:**
- Desni klik v WebView -> "Inspect"
- 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 =====
* [[.:sicherheit|Varnostne smernice]]
* [[.:testing|Testiranje]]
* [[.:extension-entwicklung|Razvoj razširitev]]