7.10 PSQL hata ayıklayıcı (debug)

<< İç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.
  • Satırlar 1 tabanlı ve nesnenin 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).
  • Durma noktası (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().