Rusrails debugging egy hema - hibakeresővel

Ha a kód váratlanul viselkedik, beírhat egy naplóba vagy konzolba a probléma azonosításához. Sajnos, néha előfordul, hogy a hiba követésének ilyen módja nem hatékony a probléma okának megtalálásában. Ha ténylegesen át kell futnia a végrehajtható kódra, a debugger a legjobb partnere.

A hibakereső segíthet abban is, hogy megismerje a Rails forráskódját, de nem tudja, hol kezdjen. Egyszerűen hibakeresse a kérelmet az alkalmazásához, és használja ezt az útmutatót, hogy megtudja, hogyan változik a kódolt kódból a mozgás a Rails-kódba.

A sín egy gem hibakeresőt használ a bontási pontok konfigurálásához és az élő kódok átadásához. A telepítéshez egyszerűen futtassa:

A sávok beépített támogatást nyújtanak a hibakereséshez, kezdve a Rails 2.0-mal. A Rails bármely alkalmazásán belül a hibakeresõt a debugger módszerrel hívhatja.

Ha megjelenik egy üzenet a konzolban vagy a naplóban:

Ügyeljen arra, hogy elindítsa a webszervert a --debugger opcióval:

Fejlesztési módban dinamikusan hívhatja meg a \ "debugger \" kifejezést ahelyett, hogy újraindítja a kiszolgálót, ha a --debugger nélkül indult.

Miután az alkalmazás felhívja a hibakeresõt. a debugger elindul a debugger környezetben a terminál ablakban, ahol az alkalmazáskiszolgáló fut, és megjelenik a debugger (rdb: n) sor. n a szálak száma. A sorban a következő sor is megjelenik, amelyik a végrehajtásra vár.

Ha a böngészőtől érkezett egy kérés, akkor a kérelmet tartalmazó böngésző lap felfüggeszti, amíg a hibakereső befejeződik és a nyomkövetés befejezi a teljes kérelem feldolgozását.

Itt az ideje, hogy tanulmányozzon és ásson be az alkalmazásába. Kezdéshez jó segítséget kérni a hibakeresőtől ... így írj: segítséget (váratlanul, igaz?)

Az alábbi parancs, amelyet megtudunk, az egyik leghasznosabb: lista. A hibakereső parancsokat lerövidítheti, ha elegendő betűvel rendelkezik ahhoz, hogy megkülönböztesse őket más parancsoktól, így a lista parancsra használható.

Ez a parancs azt mutatja meg, hogy hol van a kód, 10 vonalat gépel az aktuális vonal közepén; Ebben az esetben a jelenlegi sor hatodik és jelölt =>.

Ha ismételjük meg a listát. Most csak l használunk. megjelenik a következő 10 sor.

És így tovább a jelenlegi fájl végére. Amikor elérte a fájl végét, a lista parancs újraindul a fájl elejétől, és folytatódik a végére, feldolgozza a fájlt körkörös pufferként.

Másrészt, hogy megnézze az előző tíz sort, írjon listát vagy l-.

Így navigálhat a fájlon belül, ha megnézed a kódot annak a vonalnak a előtt és után, amelybe a hibakeresőt hozzáadta. Végül, ha újra látni szeretnéd, hogy hol vagy a kódod, írj list =.

Amikor elkezdi az alkalmazás hibakeresését, akkor különböző környezetekben helyezkedik el, amikor a verem különböző részein halad át.

A hibakereső létrehoz egy kontextust, amikor elér egy töréspontot vagy eseményt. A kontextus információ felfüggesztését a program, amely lehetővé teszi, hogy a hibakereső megtekintheti a verem, a változók értékei tekintetében a program hibakeresést, és információkat tartalmaz a hely, ahol a program hibakeresést leáll.

Bármikor visszahívhat visszahívást (vagy annak záradékát), hogy kinyomtassa az alkalmazás nyomvonalát. Ez hasznos ahhoz, hogy tudd meg, hol vagy. Ha valaha is elgondolkoztál, hogy van valami a kódban, akkor a visszavágás megadja a választ.

Ebben a nyomvonalon megy át, ahová ez a nyomvonal (ez megváltoztatja a kontextust) a frame_n_ paranccsal. ahol n az adott keretszám.

A rendelkezésre álló változók megegyeznek, mintha a kódot soronként futtatnák. Végül ez valami hibakeresés.

Mozgás a veremkereten: használhatja a [n] (u) és a [n] utasításokat, hogy megváltoztassa az n kereteket a verem felfelé vagy lefelé. n alapértelmezés szerint egy. Ebben az esetben a nagyobb méretű stackkeretekre, valamint a kisebb számokból álló keretekre kerülnek.

A szálak (szálak)

A hibakeresõ megtekintheti, leállíthatja, újraindíthatja és átválthat a futó szálak között a szál paranccsal (vagy rövidítve). Ennek a parancsnak számos lehetősége van:

  • a szál az aktuális szálat mutatja
  • A téma listája az összes szálat és állapotát jeleníti meg. A pluszjel és a szám jelöli az aktuális végrehajtási szálat.
  • A thread stop _n_ leállítja az n menetét.
  • szál folytatása _n_ folytatja az n szálat.
  • A _n_ szálkapcsoló az aktuális szál kontextusát n-re változtatja.

Ez a parancs nagyon hasznos, különösen akkor, amikor párhuzamos szálakat debugol, és meg kell győződnie arról, hogy a kódban nincs versenyfeltétel.

Bármelyik kifejezés kiértékelhető a jelenlegi kontextusban. A kifejezés kiszámításához írja be!

Ez a példa megmutatja, hogyan írhatja be az aktuális környezetben definiált instance_variableket:

Ahogy már megértettük, minden változó megjelenik, amelyhez hozzáférést kap a vezérlő. Ezt a listát dinamikusan frissíti a kód végrehajtása. Például, indítsa el a következő sort a következővel (majd ezt a parancsot egy kicsit később megnézzük ebben a bemutatóban).

Ezután ismét kérdezzen instance_variables:

Beállíthatod az irb módot az irb paranccsal (természetesen!). Így az irb munkamenet elindul az összefüggésben, ami okozta. Figyelmeztetjük azonban: ez egy kísérleti jellegzetesség.

A var módszer a változók és értékek megjelenítésének kényelmesebb módja:

A p (print) és a pp (pretty print) parancsok felhasználhatók a Ruby kifejezések értékeléséhez és a változók értékének megjelenítéséhez a konzolban.

A megjelenített listában szereplő változók az értékükön kerülnek kinyomtatásra, miután azokat a veremre helyezték. Egy változó megjelenítésének leállításához használja a _n_ nem_megjelenítést. ahol n a változó száma (az utolsó példában 1).

Lépésről lépésre

Most már tudod, hogy hol van a futó nyomon, és képesek nyomtatni a rendelkezésre álló változókat. Folytassuk és megismerjük az alkalmazás végrehajtását.

Használja a lépést (short for s), hogy folytassa a program futását addig, amíg a következő logikai breakpoint és return control debugger nem fut.

A lépést + n-et és az -i lépést is használhatod, ha előrelépéshez vagy visszafelé haladsz n lépéssel.

A következő is használható. amely a lépéshez hasonló, de egy sorban végrehajtott függvény vagy módszer végrehajtása leállítás nélkül történik. A lépéshez hasonlóan a pluszjelet az n lépésekre való áttéréshez használhatja.

A következő és a lépés közötti különbség az, hogy a lépés a végrehajtható kód következő sorában megáll, és csak egy lépést tesz meg, míg a következő a következő sorba lép, anélkül, hogy beléptetne volna a metódusokba.

Például, vegye figyelembe ezt a kódblokkot a mellékelt hibakereső kifejezéssel:

Segítségével hibakeresőt használhat a sínkonzol használatakor. Ne felejtsd el hívni a hibakeresőt, mielőtt hívtad a debugger módszert.

A kód megállt, nézzük vissza:

Ha mélyebbre szeretne lépni a köteg nyomában, akkor léphet egy lépéssel. a hívási módokon és a Rails kódon keresztül. Ez a legjobb módja annak, hogy megtalálja a hibákat a kódban, és esetleg a Ruby vagy a Rails.

töréspontok

A töréspont leállítja az alkalmazást, amikor elér egy bizonyos pontot a programban. Ez a sor hívja a debugger shell-et.

Bontási pontokat dinamikusan hozzáadhat a szünet parancshoz (vagy csak b). Három lehetséges mód van a töréspontok manuális hozzáadására:

  • törésvonal. egy töréspontot állít be az aktuális forrásfájl sorában.
  • break file: line [ha kifejezés]. egy töréspontot állít be a fájl fájl sorában. Ha kifejezés van megadva. értékelni kell, és egyenlőnek kell lennie a valódi értékkel. a debugger elindításához.
  • törésosztály (. | #) módszer [ha kifejezés]. egy töréspontot állít be az osztály osztályban definiált metódusban (. és # módszer az osztályra és az instancstémákra). kifejezés ugyanúgy működik, mint a fájl: line.

A töréspontok listájának megjelenítéséhez használja az info töréspontokat _n_ vagy az info break _n_ parancsot. Ha megad egy számot, csak ez a töréspont jelenik meg. Ellenkező esetben minden töréspont megjelenik.

Töréspontok törlése: az n töréspontszám megszüntetéséhez használja a delete _n_ parancsot. Ha a szám nincs megadva, akkor az összes aktív töréspont törlődik.

A töréspontokat is engedélyezheti vagy letilthatja:

  • lehetővé teszik a töréspontokat. engedélyezi a törlési pontok listáját, vagy mindegyiküket, ha a lista nincs meghatározva, hogy leállítsa a programot. Ez a létrehozott töréspontok alapértelmezett állapota.
  • letiltja a töréspontokat. A töréspontok nem befolyásolják a programot.

Kivételek kivétele

A fogási kivétel-név (vagy csak a cat exception-name) parancs használható a kivétel-név kivételével. amikor a kezelőt egyébként hívják.

A végrehajtás folytatása

A debugger által leállított alkalmazás végrehajtásának kétféleképpen folytatható:

szerkesztés

A hibakeresőből való kilépéshez használja a quit parancsot (rövidítve q) vagy a kilépési álnevet.

Egy egyszerű kilépés megpróbálja megállítani az összes szálat. Ezért a kiszolgáló leáll, és újra be kell indítania.

  • állítsa be az újratöltést. előtelepítse a forráskódot, amikor módosítja.
  • állítsa be az autolistot. Futtassa a lista parancsot minden töréspontnál.
  • állítsd ki a _n_ listát. Állítsa be a kódsorok számát alapértelmezés szerint. N.
  • állítsa be a forcestepet. Győződjön meg róla, hogy a következő és lépés parancsok mindig új sorra váltanak

Ezek a beállítások elmenthetők a .rdebugrc fájlba a saját könyvtárban. A debugger ezeket a globális beállításokat olvassa el indításkor.

Íme egy jó kezdet a .rdebugrc számára: