This is a documentation for Board Game Arena: play board games online !

Працтицал дебуггинг

Извор: Board Game Arena
Пређи на навигацију Пређи на претрагу

Тхис паге гивес yоу працтицал типс то дебуг yоур гаме дуринг тхе девелопмент. Дон'т хеситате то схаре wитх ус yоур диффицултиес ин ордер wе цан импрове тхис сецтион.

Тоолс

То wорк он БГА Студио, wе рецомменд yоу то усе [www.гоогле.цом/цхроме Гоогле Цхроме] ас ит'с тхе цуррент фастест броwсер фор БГА платформ, анд ит'с аваилабле ин алл ОС.

Анотхер реасон то усе Цхроме ис тхат ит ембед алл тоолс yоу неед то wорк он БГА Студио. Yоу цан сее тхем бy прессинг "Ф12" ор фром тхе мену ("Тоолс > Девелопмент тоолс").

А гоод працтице ис то усе а сецонд броwсер то девелоп тхе гаме, ин ордер то цхецк тхат yоур гаме ис wоркинг фине он тхис броwсер тоо.

То дебуг wитх Фирефоx броwсер, wе адвисе yоу то усе тхесе 2 еxтенсионс:

То дебуг wитх Интернет Еxплорер, wе адвисе yоу то усе оне оф тхе мост рецент версион (еx: ИЕ9). Ласт версионс оф Интернет Еxплорер хаве wаy беттер девелопмент тоолс тхан тхе превиоус онес...

Генерал тип фор дебуггинг

Ин генерал фор дебуггинг, тхинк оф усинг тхе 'саве & ресторе стате' фунцтионалитy. Ит енаблес yоу то саве тхе стате оф yоур гаме јуст бефоре тхе иссуе yоу аре инвестигатинг, тхен цоме бацк то тхат поинт wитх оне цлицк ас манy тимес ас неедед то ундерстанд wхат ис гоинг wронг.

Yоу цан саве уп то 3 дифферент статес.

Дебуггинг мy гаме wхен ит цаннот старт

Иф yоур гаме дон'т старт бецаусе оф ан еррор, yоу аре пробаблy ин оне оф тхесе ситуатионс:

  • Тхере ис а СQЛ еррор ин yоур дбмодел.сqл филе.
  • Yоу хаве а сyнтаx еррор ин yоур ПХП филе.
  • Yоур ПХП "сетуп" - ор анy метход усед дуринг тхе гаме инитиал статес - генератес ан еxцептион.

Иф тхе еррор ис нот еxплицитлy дисплаyед wхен yоу цлицк он "Еxпресс старт", yоу схоулд цхецк тхе "Гамесервер еррор лог" ас пер Студио логс.

Дебуггинг мy ПХП гаме логиц (ор мy виеw)

Мост оф тхе тиме, дебуггинг ПХП ис qуите еасy. Хере'с wхат I до wхен I wант то девелоп/дебуг соме гаме логиц тхат ис триггеред бy соме гаме ацтион:

  • Ат фирст, I маке суре тхат I цан репродуце тхе неедед гаме ситуатион ин оне цлицк. То до тхис, I усе тхе "саве & ресторе" фунцтион.
  • Анотхер поссибилитy фор тхис ис то плаце а дие('ок'); ПХП статемент ригхт афтер тхе ПХП I ам девелопинг/дебуггинг. Тхис wаy, I маке суре тхат еверy реqуест wилл фаил анд тхен нотхинг wилл бе цоммитед то тхе датабасе, анywаy.
  • Тхен, I усе вар_думп фунцтион то думп ПХП вариаблес анд цхецк wхат'с wронг, унтил ит wоркс.

Еxампле:


// (...my code to debug)

var_dump( $my_variable );
die('ok');

// (...my code to debug)

Адд трацес то yоур цоде

Yоу цан усе тхе фоллоwинг фунцтионс ин yоур гаме то адд сервер сиде логгинг:

селф::дебуг( $мессаге ); // дебуг левел логгинг

селф::траце( $мессаге ); // инфо левел логгинг

селф::wарн( $мессаге ); // wарнинг левел логгинг

селф::еррор( $мессаге ); // еррор левел логгинг

То сее тхе логс, yоу схоулд цхецк тхе "Цуррент табле еррор лог" ин тхе Студио бацкоффице.

Тхис цан бе усефул wхен yоу неед то фоллоw тхе флоw оф yоур цоде анд нот јуст стоп ит то сее хоw ит гоес ат соме поинт.

Онлy тхе еррор лог левел wилл аппеар ин продуцтион. Тхис левел схоулд бе усед онлy фор цритицал проблемс. Отхер левелс wилл схоw онлy ин тхе девелопмент енвиронмент анд цан бе усед ас yоу сее фит.

Дебуггинг мy ХТМЛ/ЦСС лаyоут

Ситуатион еxамплес:

  • wхy мy гаме елемент доесн'т схоw уп ин тхе интерфаце?
  • wхy мy ЦСС пропертy хасн'т беен апплиед то тхис елемент?
  • wхy тхис гаме елемент ис дисплаyед ат тхис поситион?

А фирст усефул тип wхен ан елемент доес нот схоw уп ин тхе интерфаце ис то гиве ит а ред бацкгроунд:

#my_element {
  ... some CSS definitions ...
  background-color: red;
}

Тхис wаy, yоу кноw иф тхе елемент ис нот висибле бецаусе оф соме оф итс ЦСС пропертy ор бецаусе оф анyтхинг елсе.

Анотхер тип: сометимес, yоу цханге а ЦСС пропертy wитх но висибле еффецт он yоур интерфаце. Ин тхат цасе, адд а "дисплаy:ноне" пропертy. Иф yоур елемент доес нот дисаппеар, тхе буг пробаблy цомес фром yоур ЦСС селецтор анд нот фром yоур ЦСС пропертy.

Усинг Цхроме "Елементс" таб (тхре фирст оне), yоу цан:

  • Сее тхе ЦУРРЕНТ ХТМЛ оф yоур паге. Ремембер тхат тхе цлассицал "схоw паге соурце" ис инеффициент wитх БГА ас yоу аре модифyинг тхе паге соурце wитх yоур Јавасцрипт цоде.
  • Усинг тхе "магнифyинг гласс", yоу цан цлицк он анy парт оф yоур гаме интерфаце анд цхецк ит'с ХТМЛ цоде анд ассоциатед ЦСС стyлес.
  • Yоу цан евен модифy дирецтлy соме ЦСС пропертy анд сее иф хоw ит лоокс иммедиателy он тхе гаме интерфаце.

Дебуггинг мy Јавасцрипт гаме интерфаце логиц

Цомпаре то ПХП дебуггинг, Јавасцрипт дебуггинг цан сометимес бе паинфул.

Хере'с аре соме типс то маке yоур лифе еасиер wхиле девелопинг анд дебуггинг Јавасцрипт:

До цомплеx тхингс он ПХП сиде

ПХП сиде ис море релиабле анд симплер то дебуг тхан Јавасцрипт. Тхен, wхен yоу неед то перформ а цомплеx оператион, цхецк фирст ит yоу цан'т wрите ит он сервер сиде фирст.

Тхе мост фреqуент цасе ис тхе фоллоwинг: yоу wант то цомпуте поссибле мовес ин а гаме ситуатион. Доинг ит ин Јавасцрипт ис а нигхтмаре. Тхен, до ит он ПХП, анд трансфер тхе ресулт то yоур цлиент интерфаце усинг тхе "аргс" гаме стате пропертy.

Ноте: цхецк Реверси еxампле фор тхис.

Адд трацес ин yоур цоде

Yоу цан усе тхе фоллоwинг:

цонсоле.лог( вариабле_то_инспецт )

Ит wилл гиве yоу тхе објецт струцтуре оф тхе вариабле ин тхе Јавасцрипт цонсоле, wитхоут блоцкинг тхе еxецутион.

Ит'с офтен а гоод идеа то прецеде тхис цалл wитх а цонсоле.лог( '### ХЕРЕ ###' ); то финд море еасилy тхе аппроприате лине ин тхе цонсоле лог.

алерт( вариабле_то_инспецт )

Ит wилл попуп wхат yоу wисх анд паусе тхе еxецутион унтил yоу цлицк ок.

Тхис wон'т бе усефул фор цомплеx струцтурес, онлy нативе тyпес wилл гет плаинлy дисплаyед. Бут тхис ис сометимес усефул јуст wитх мессагес то маке суре wхицх wаy тхе еxецутион гоес.

Соме фреqуент еррорс

wхен лаунцхинг тхе гаме "Фатал еррор дуринг цреатион оф датабасе ебд_qуоридор_389 Нот логгед."

Цхецк тхат yоу дидн'т усе $г_усер ор гетЦуррентПлаyерИд() ин сетупНеwГаме() фунцтион ор ин ан "аргс" фунцтион оф yоур стате.

Ас тхесе фунцтионс аре нот цонсеqуенцес оф а усер ацтион, тхере ис но цуррент плаyер дефинед.

Ас а генерал руле, yоу схоулд усе гетАцтивеПлаyерИд() анд нот гетЦуррентПлаyерИд(). Сее тхе пресентатион он тхе гаме стате мацхине фор море информатион.

wхен рефресхинг тхе wеб паге, тхе интерфаце ремаинс он "Апплицатион лоадинг..."

Ин тхис цасе, yоу пробаблy хаве а сyнтаx еррор ин yоур Јавасцрипт цоде, анд тхе интерфаце рефусес то лоад.

То финд тхис еррор, цхецк иф тхере ис ан еррор мессаге ин тхе Јавасцрипт цонсоле (Ф12).

Иф тхере ис реаллy нотхинг он тхе лог, ит'с пробаблy тхат тхе сyстем wас унабле то лоад yоур Јавасцрипт бецаусе оф ан сyнтаx еррор тхат аффецт тхе струцтуре оф тхе Јавасцрипт филе, тyпицаллy а миссинг "}" ор а миссинг "," афтер а метход дефинитион.

Wхен I до а мове, I гот "Мове рецордед, wаитинг фор упдате ..." форевер

"Мове рецордед" меанс тхат yоур ајаxцалл реqуест хас беен сент то тхе сервер анд ретурнед нормаллy.

"Wаитинг фор упдате" меанс тхат yоур цлиент интерфаце ис wаитинг фор соме нотифицатионс фром тхе сервер тхат цорреспонд то тхе мове wе јуст дид.

Иф тхис мессаге стаyс форевер, ит ис пробаблy тхат yоур ПХП цоде доес нот сенд анy нотифицатион wхен тхе мове хаппенс, wхицх ис абнормал. То фиx тхис: адд а нотифyАллПлаyерс ор а нотифyПлаyер цалл ин yоур ПХП цоде.

Соме плаyер ацтион ис триггеред рандомлy wхен I цлицк сомеwхере он тхе гаме ареа

Yоу пробаблy усед "дојо.цоннецт" он а нулл објецт. Ин тхис цасе, дојо.цоннецт ассоциате тхе евент (еx: "онцлицк") то тхе wхоле гаме ареа.

Мост оф тхе тиме ит хаппенс ин тхис ситуатион, wхен мy_објецт елемент доес нот еxистс:

   dojo.connect( $("my_object"), "onclick", this, function() {
     ...
   }

То детермине иф тхис ис тхе цасе, плаце "алерт( $("мy_објецт") )" бефоре тхе дојо.цоннецт то цхецк иф тхе објецт еxистс ор нот.

Јавасцрипт доес нот кноw хоw то сум тwо нумберс

Бе царефул wхен yоу манипулате интегерс ретурнед бy нотифицатионс: мост оф тхе тиме, Јавасцрипт цонсидерс тхеy аре Стрингс анд нот Интегерс.

Ас а ресулт:

    var i=1;
    i += notif.args.increment;  // With notif.args.increment='1'
    alert( i );                 // i=11 instead of 2 !! Javascript concatenate 2 strings !

То солве тхис, yоу схоулд усе тхе "тоинт" фунцтион:

    var i=1;
    i += toint( notif.args.increment );  // With notif.args.increment='1'
    alert( i );                 // i=2 :)

Јавасцрипт: до нот усе субстр wитх негативе нумберс

То гет тхе ласт цхарацтерс оф а стринг, усе "слице" инстеад оф "субстр" wхицх хас а буг он ИЕ:

    var three_last_characters = string.substr( -3 );   // Wrong
    var three_last_characters = string.slice( -3 );    // Correct