59

Алексей Андросов - Debugger: Отладка кода

  • Upload
    yandex

  • View
    1.466

  • Download
    2

Embed Size (px)

DESCRIPTION

В лекции рассказано о доступных средствах по отладке веб-сайтов, их возможностях, а также способах их использования. Также речь пойдет о том, как искать ошибки у пользователей в продакшене и контролировать качество продукта.

Citation preview

Page 1: Алексей Андросов - Debugger: Отладка кода
Page 2: Алексей Андросов - Debugger: Отладка кода

DebuggerАлексей  Андросов

Старший  разработчик  интерфейсов

Школа  разработки  интерфейсов,  Яндекс,

2013  год

Page 3: Алексей Андросов - Debugger: Отладка кода

Баги  –  этонормально

Page 4: Алексей Андросов - Debugger: Отладка кода

Баги  –  это  нормально●    Человеку  свойственно  ошибаться.

●    Браузер  –  неконтроллируемая  среда  для  исполнения  вашего

кода.

●    Нестабильное  сетевое  соединение.

●    Дефграгменация  рынка  браузеров.

Если  вы  меряете  эффективность  своей  работы  по  количеству

багов,  поздравляю,  у  вас  серьёзные  проблемы.

04

Page 5: Алексей Андросов - Debugger: Отладка кода

Первое  правило:вы  —  дурак,а  все  вокруг  —Д'Артаньяны

Page 6: Алексей Андросов - Debugger: Отладка кода

Второе  правило:ошибка  не  в  вашемкоде,  а  в  кодевашей  команды

Page 7: Алексей Андросов - Debugger: Отладка кода

С  чего  начать?1.  Выдохните,  расслабьтесь,  выпейте  чаю

2.  Локализовать  проблему  в  рамках  фронтед-­бекенд

07

Page 8: Алексей Андросов - Debugger: Отладка кода

Что  у  насесть  варсенале?

Page 9: Алексей Андросов - Debugger: Отладка кода

alert()  –наше  всё!  

Page 10: Алексей Андросов - Debugger: Отладка кода

Какие  еще  дедовские  способыесть?

●    Красить  DOM-­ноды  с  помощью   background:red  или

border: 1px solid #F00

●    Метод  «половинчатого  деления  кода»

10

Page 11: Алексей Андросов - Debugger: Отладка кода

Метод  «половинчатогоделения  кода»  поможет:

●    здесь:   var obj = {a: 1, b: 2 , }; ,

●    и  здесь:   (function(){})() (function(){})() ,

●    и  при  падении  браузера.

Но  пацаны  с  раёна  говорят,  что  правильно  использовать

статический  анализ  кода  и  git-­bisect  

11

Page 12: Алексей Андросов - Debugger: Отладка кода

Современныесредстваотладки

Page 13: Алексей Андросов - Debugger: Отладка кода

WebKit  Web  Inspector

Page 14: Алексей Андросов - Debugger: Отладка кода

Firefox  +  Firebug

Page 15: Алексей Андросов - Debugger: Отладка кода

Firefox  +  Web  Developer  Tools

Page 16: Алексей Андросов - Debugger: Отладка кода

IE  Developer  Tools  (IE  >=  8)

Page 17: Алексей Андросов - Debugger: Отладка кода

IE  <  8●    IE  Developer  Toolbar/IE7

●    DebugBar

●    Companion.JS

●    MS  Visual  Studio

●    Script  Debugger

●    …

17

Page 18: Алексей Андросов - Debugger: Отладка кода

Opera  Dragonfly

Page 19: Алексей Андросов - Debugger: Отладка кода

Что  можно  с  ними  делать?●    HTML/CSS:  просмотр  DOM-­дерева,  редактирование  стилей

●    JavaScript:  отладка,  профилирование

●    Процесс  загрузки  страницы

●    и  не  только  это…

19

Page 20: Алексей Андросов - Debugger: Отладка кода

Net-­panel

Page 21: Алексей Андросов - Debugger: Отладка кода

Процесс  загрузки

Page 22: Алексей Андросов - Debugger: Отладка кода

Подробная  информация  о  запросе

Page 23: Алексей Андросов - Debugger: Отладка кода

Отладка

JavaScript

Page 24: Алексей Андросов - Debugger: Отладка кода

DebuggerОтладка  –  это  построчное  выполнение  кода  с  просмотром

текущего  состояния.  Это  самый  точный  способ  увидеть  проблему.

Но  это  не  витальный  ответ  на  все  проблемы.  К  примеру,  сложно

работать  с  нелинейным  кодом  с  асинхронными  вызовами.  А  ещё

отладка  останавливает  выполнение  кода,  и  асинхронные  запросы

(например,  ajax)  могут  потерятся.

24

Page 25: Алексей Андросов - Debugger: Отладка кода

Как  остановить?●    ключевое  слово   debugger  в  коде

●    

●    

25

Page 26: Алексей Андросов - Debugger: Отладка кода

Как  остановить  по  условию?

●    

●    

26

Page 27: Алексей Андросов - Debugger: Отладка кода

Кто  изменяет  DOM-­дерево?

●    

27

Page 28: Алексей Андросов - Debugger: Отладка кода
Page 29: Алексей Андросов - Debugger: Отладка кода

Кнопки  управления

1.  Resume:  продолжить  выполнение

2.  Step  over:  перейти  в  к  следующему  выражению

3.  Step  into:  зайти  внутрь  функции

4.  Step  out:  выйти  из  функции

29

Page 30: Алексей Андросов - Debugger: Отладка кода

Console

Page 31: Алексей Андросов - Debugger: Отладка кода

ConsoleЛогирование  –  это  вывод  в  консоль  браузера  полезной

информации  в  процессе  исполнения  кода.

Можно  выводить  абсолютно  всё:  собственные  сообщения,

переменные,  DOM-­ноды  и  т.п.

31

Page 32: Алексей Андросов - Debugger: Отладка кода

console.log()  /  info()  /  warn()  /error()console.log('console.log');

console.warn('console.warn');

console.info('console.info');

console.error('console.error');

console.group('console.group');

console.log('msg1');

console.groupEnd('console.group');

01.

02.

03.

04.

05.

06.

07.

32

Page 33: Алексей Андросов - Debugger: Отладка кода

console.log()  /  info()  /  warn()  /  error()

Page 34: Алексей Андросов - Debugger: Отладка кода

console.log()  и  передачазначений  по  ссылкеfunction doSmth(obj) {

console.log(obj);

obj.prop = 2;

}

doSmth({

prop: 1

});

01.

02.

03.

04.

05.

06.

07.

34

Page 35: Алексей Андросов - Debugger: Отладка кода

console.log()  и  передачааргументов  по  ссылке

●    В  Firefox  поможет  console.dir()

●      В  остальных  браузерах  придется  копировать  объекты:

●    console.log(  JSON.parse(JSON.stringify(myObj))  )

●    console.log(  [].concat(arr)  )

●    console.log(  node.cloneNode(true)  )

35

Page 36: Алексей Андросов - Debugger: Отладка кода

Что  еще  есть?●    Вывод  стека  выполнения  до  текущего  момента:  console.trace()

●    Замер  времени  исполнения:  console.time('myFunc')  /

console.timeEnd('myFunc')

●    Профилирование:  console.profile('myFunc')  /

console.profileEnd('myFunc')

●    …

36

Page 37: Алексей Андросов - Debugger: Отладка кода

Какотслеживатьсобытия?

Page 38: Алексей Андросов - Debugger: Отладка кода

Chrome

Page 39: Алексей Андросов - Debugger: Отладка кода

Firefox

Page 40: Алексей Андросов - Debugger: Отладка кода

Firefox  +  Firebug  +  EventBug

Page 41: Алексей Андросов - Debugger: Отладка кода

Firefox  +  Firebug  +  Firequery

Page 42: Алексей Андросов - Debugger: Отладка кода

А  какотлаживатьсявпродакшене?

Page 43: Алексей Андросов - Debugger: Отладка кода

window.onerrorwindow.onerror = function(msg, url, line) {

new Image().src = '/log?type=jserror' +

'&msg=' + encodeURIComponent(msg) +

'&url=' + encodeURIComponent(url) +

'&line=' + encodeURIComponent(line);

}

01.

02.

03.

04.

05.

06.

43

Page 44: Алексей Андросов - Debugger: Отладка кода

Главная  проблемаwindow.onerrorIf  the  location  URL  does  not  have  a  same  origin  as  the  origin,  then  set

message  to  "Script  error.",  set  location  to  the  empty  string,  and  set

line  to  0.

http://dev.w3.org/html5/spec/webappapis.html#report-­the-­error“

44

Page 45: Алексей Андросов - Debugger: Отладка кода

Главная  проблемаwindow.onerrorМожно  обойти  в  Firefox:

<script src="…" crossorigin="anonymous"></script>

А  сервер  должен  ответить  CORS-­заголовком

Access-­Control-­Allow-­Origin:  *

45

Page 46: Алексей Андросов - Debugger: Отладка кода

Логирование  неожиданногоповеденияif (allGoesWell) {

// все хорошо

} else {

new Image().src = '/log?type=something_went_wrong' +

'&some_usefull_data=' + encodeURIComponent(data)

}

01.

02.

03.

04.

05.

06.

46

Page 47: Алексей Андросов - Debugger: Отладка кода

Логирование  исключенийtry {

// все хорошо

} сatch (e) {

var msg = e.message || e.toString();

new Image().src = '/log?type=exception' +

'&msg=' + encodeURIComponent(msg)

'&stack=' + encodeURIComponent(e.stack)

}

01.

02.

03.

04.

05.

06.

07.

08.

47

Page 48: Алексей Андросов - Debugger: Отладка кода

Транспорты  и  долговисящиесоединенияИх  можно  отлаживать  с  помощью  скрытой  консоли,  доступной  по

хоткею.

●    Всегда  можно  посмотреть  все  события

●    Можно  отправлять  весь  лог  на  анализ

48

Page 49: Алексей Андросов - Debugger: Отладка кода

Статическийанализ  кода

Page 50: Алексей Андросов - Debugger: Отладка кода

Статический  анализ  HTML

●    validator.w3.org

●    over  9000  плагинов  для  браузеров  и  редакторов

●    tidy  из  консоли  или  API  validator.w3.org

50

Page 51: Алексей Андросов - Debugger: Отладка кода

Статический  анализ  CSS●    jigsaw.w3.org/css-­validator/

●    over  9000  плагинов  для  браузеров  и  редакторов

●    CSSLint  из  консоли  или  API  jigsaw.w3.org/css-­validator/

Но,  честно  говоря,  CSSLint  не  очень

51

Page 52: Алексей Андросов - Debugger: Отладка кода

Статический  анализ  JS●    JSLint  и  его  форк  JSHint

●    over  9000  плагинов  для  браузеров  и  редакторов  (отличные

инспекции  JS  в  WebStorm)

●    jshint.com,  jslint.com

52

Page 53: Алексей Андросов - Debugger: Отладка кода

Статический  анализ  JSПоможет  найти  синтаксические  ошибки  и  возможные  логические

ошибки

if (myVar = 'someValue')

if (myVar & anotherVar)

01.

01.

53

Page 54: Алексей Андросов - Debugger: Отладка кода

Полезныесоветы

Page 55: Алексей Андросов - Debugger: Отладка кода

Сохранение  объекта  дляпоследующего  исследованияif (DEBUG_MODE) {

window.objToWatch = myHiddenObject;

}

После  этого  можно  из  консоли  иметь  доступ  к  объекту.

01.

02.

03.

55

Page 56: Алексей Андросов - Debugger: Отладка кода

Исследование  внешнихбиблиотекvar _LibSomeFunc = Lib.someFunc

Lib.someFunc = function() {

console.log('Lib.someFunc wrapper', arguments);

_LibSomeFunc.apply(this, arguments)

}

01.

02.

03.

04.

05.

56

Page 57: Алексей Андросов - Debugger: Отладка кода

Форматирование  кода  (Chrome,  Opera)

Page 58: Алексей Андросов - Debugger: Отладка кода
Page 59: Алексей Андросов - Debugger: Отладка кода

DebuggerАлексей  Андросов

Старший  разработчик  интерфейсов

Школа  разработки  интерфейсов,  Яндекс,

2013  год