|
<< İçindekileri Görüntülemek İçin Tıklayın >> Yer: Teknik Kılavuzlar > Netsim System Agent İstemci Protokolü Referansı > 7. IVEDI oturum protokolü (/ivedi) > 7.10 PSQL hata ayıklayıcı (debug) |
Oturum kendi deyimlerinin PSQL kodunu (saklı yordam, fonksiyon, paket gövdesi, tetikleyici, EXECUTE BLOCK, betik) durma
noktasında durdurur, adım adım yürütür, çağrı yığınını ve değişkenleri okur. Tasarım ve kararlar:
IVEDI_Code/docs/ivedi-debugger-plan.md.
Kapı: conf debugMode (öndeğer açık) açık olmalı ve login MASTER'da DEBUGGER rolünü taşımalı (SYSDBA muaf; rol
SYSADMIN'e içkin değildir, veritabanı hakkı vermez). LSP oturumu ayıklayamaz. İzin open yanıtının capabilities
listesinde "debug" olarak görünür; izinsiz debug komutu DEBUG_DISABLED (27025) verir.
Model: aynı soket. Hata ayıklama açıkken execute / executePrepared / script / fetch koşarken motor bir PSQL deyim
sınırında durunca sunucu idsiz {"notification": "debug", "state": "stopped", ...} çerçevesini yazar ve asıl komutun
yanıtını bekletir; istemci bu sırada aynı soketten idli debug (ve ping) komutları gönderir, her biri olağan yanıt alır.
continue / stepOver / stepInto / stepOut deyimi sürdürür; terminate deyimi DEBUG_TERMINATED (27026, SQLSTATE
57014) ile bitirir, oturum kullanılabilir kalır. Duraklamada başka bir komut DEBUG_STOPPED (27023) ile reddedilir (durum
korunur). Duraklama boyunca işlem, satır kilitleri ve depo bağlantısı açık kalır; deyim süre sınırı (statementTimeoutMs)
askıdadır; boşta kalma sayacı güncel tutulur; bağlantı koparsa deyim sonlandırılır.
debug action |
Alanlar | Yanıt |
|---|---|---|
enable |
breakOnException? (none / all / uncaught, öndeğer none), pauseOnNext? |
enabled: true |
disable |
- | durma noktaları silinir; duraklamadaysa deyim sürer |
setBreakpoints |
object? (ŞEMA.AD; yoksa betik / EXECUTE BLOCK), lines: [n \| {line, condition?} ...] (nesnenin listesi bütünüyle değişir, boş liste siler; condition PSQL ifadesi, duran deyimin bağlamında TRUE ise durulur, değerlenemezse yine durulur) |
object, breakpoints: [{line, verified, condition?}] |
clearBreakpoints |
object? (yoksa hepsi) |
breakpoints (kalanlar) |
pauseOnNext |
value? (öndeğer true) |
bir sonraki deyimin ilk PSQL deyiminde durur (reason: "entry") |
breakOnException |
value (none / all / uncaught) |
- |
status |
- | enabled, stopped, breakpoints |
continue / stepOver / stepInto / stepOut |
yalnız duraklamada | state: "running" |
frames |
yalnız duraklamada | frames (bildirimdekiyle aynı) |
variables |
frame? (0 = en içteki), scope? (params / locals / returns / new / old / exception; yoksa hepsi) |
variables: [{name, kind, type?, value \| ref \| cursor}] |
properties |
ref (iç içe örnek: dizi, PARAMS listesi, kayıt) |
properties: [...] |
evaluate |
frame?, expression (ad: v, new.x, kayit.alan; ya da PSQL ifadesi: v * 10 + a, coalesce(r, 0) > 2 - çerçevenin duran / çağıran deyiminin bağlamında derlenir ve değerlenir, yan etkili çağrılar dahil) |
value ya da error |
terminate |
yalnız duraklamada | state: "terminated"; asıl komut DEBUG_TERMINATED ile biter |
Duraklama dışında adım / inceleme eylemleri DEBUG_NOT_STOPPED (27024) verir. POST /ivedi/debug gövde
{"connectionId", "cancelKey", "action": "pause"} (iptal ucunun sözleşmesi: kimliksiz, başka bir HTTP bağlantısından)
koşan deyimi bir sonraki PSQL deyim sınırında durdurur (reason: "pause"); deyim koşmuyorsa bayrak bir sonraki deyimde
tutar. Yanıt 200 {"result": true|false}.
Duraklama çerçevesi:
{"notification": "debug", "state": "stopped", "reason": "breakpoint",
"frames": [{"index": 0, "kind": "procedure", "object": "APP.DBG_OUTER", "objectId": 10000123, "line": 5, "column": 2},
{"index": 1, "kind": "script", "object": "", "objectId": 0, "line": 1, "column": 0}]}
reason: breakpoint, step, pause, exception (çerçeveye exception: {name, code, sqlState, message} eklenir; all
ilk fırsatta, WHEN işleyicisinden önce; uncaught yalnız hiçbir blok yakalamayacaksa), entry (pauseOnNext).kind: procedure, function, trigger, block (EXECUTE BLOCK), script (üst düzey deyim). Dış çerçevelerin
line'ı çağıran deyimin satırıdır.IVD$SOURCE metnine bağıl (CREATE'in ilk belirtecinin satırı 1; motorun hata yığın
izindeki methodline ile aynı); betikte ve EXECUTE BLOCK'ta gönderilen metne göre mutlak. column 0 tabanlı.object: veritabanı adsız, büyük harf: ŞEMA.AD, paket üyesi ŞEMA.PAKET.AD, tetikleyici ŞEMA.TETİKLEYİCİ
(create trigger app.t_bi for app.t -> APP.T_BI). setBreakpointse aynı biçim verilir (küçük harf de olur).(nesne, satır) ile tutulur; satırda deyim yoksa durulmaz (verified yalnız satırın pozitif olduğunu
söyler). stepOver çağrılan yordamı atlar, stepInto girer (SELECT'in satır başına çağırdığı fonksiyon dahil),
stepOut çağırana döner. Durma yalnız PSQL deyim sınırındadır: ifade içi ve SELECT'in satır döngüsünde durulmaz.variables: kind = param_in / param_out / returns / local / self / new / old / exception / cursor /
property; cursor = kapsayan FOR SELECT ... AS CURSOR c döngüsünün o anki satırı, adı C.<kolon>;
type tanımlayıcı adı; value sonuç kümeleriyle aynı kodlama (§7.6). İmleç değişkeni cursor: "open" | "closed";
iç içe örnek ref (duraklama boyunca geçerli). Tetikleyicide NEW.<kolon> / OLD.<kolon> adlarıyla.EXECUTION STORAGE veritabanında depoya devredilen yordam / tetikleyici motorda koşmaz, durulmaz.QUERY_CANCELED ve DEBUG_TERMINATED istisna değil müdahaledir: WHEN ANY bile yakalamaz.Sınama: sqltest/tools/ivedi_api_test.py test_debug (JSON + BSON, --workers iki kip); Python istemcisi
IvediClient.on_notification + debug() + debug_pause().