72
Photo by Joseph B // cc by- nc - nd 2.0 // https://flic.kr/p/7GAMBe Debugging Effectively Colin O’Dell @colinodell

Debugging Effectively - SunshinePHP 2017

Embed Size (px)

Citation preview

Page 2: Debugging Effectively - SunshinePHP 2017

OverviewI. Importance of debuggingII. Debugging processIII. Tools & TechniquesIV. Q&A

Photo by Roman Boed // cc by 2.0 // https://flic.kr/p/ngwcf1

@colinodell

Page 8: Debugging Effectively - SunshinePHP 2017

Photo by florianric // cc by 2.0 // https://flic.kr/p/c4QJzC

PlanningCoding

@colinodell

Page 9: Debugging Effectively - SunshinePHP 2017

Photo by florianric // cc by 2.0 // https://flic.kr/p/c4QJzC

Planning

Testing & Debugging

Coding

@colinodell

Page 14: Debugging Effectively - SunshinePHP 2017

Junior Developers• Try the “usual” steps• bin/console cache:clear• composer install• chmod –R 777 *

• Ask somebody else• Co-worker• Google• StackOverflow post

Photo by Yoel Ben-Avraham, with changes // cc by--nd 2.0 // https://flic.kr/p/6pmtQL

@colinodell

Page 16: Debugging Effectively - SunshinePHP 2017

XY ProblemPhoto by Yoel Ben-Avraham, with changes // cc by--nd 2.0 // https://flic.kr/p/6pmtQL

•I want to solve problem X•How do I solve X?•Solution Y might work•How can I do Y?

@colinodell

Page 17: Debugging Effectively - SunshinePHP 2017

Photo by quattrostagioni // cc by 2.0 // https://flic.kr/p/aGjVq8

1.Don’t parse HTML with regex2.Solve problems the right way

@colinodell

Page 19: Debugging Effectively - SunshinePHP 2017

Bugs are logical

Photo by Photofest

@colinodell

Page 20: Debugging Effectively - SunshinePHP 2017

“The bug is not moving around in your code, trying to trick or evade you. It is just siting in one place, doing the wrong thing in the same

way every time.” – Nick Parlante, Debugging Zen

Photo by GrahamC57 // cc by-nc-nd 2.0 // https://flic.kr/p/cwJi9Q

@colinodell

Page 23: Debugging Effectively - SunshinePHP 2017

1. Gather information

• Expected behavior vs.actual behavior• Error messages• Stack traces

Photo from youmustdesireit.wordpress.com

• Screenshots•Browser & OS•Date & time• Log entries

@colinodell

Page 24: Debugging Effectively - SunshinePHP 2017

2. Replicate the Issue

Be able to replicate with 100% certainty

Photo by Nick Royer // cc by-sa // https://flic.kr/p/d41ASC

@colinodell

Page 25: Debugging Effectively - SunshinePHP 2017

3. Identify the CulpritPhoto by U.S. Navy // cc 2.0 // https://flic.kr/p/n6Wgks

• Be methodical• Make no assumptions• Understand the bug

@colinodell

Page 26: Debugging Effectively - SunshinePHP 2017

4. Fix it & Re-test• Attempt to replicate again• Avoid XY problem• No temporary workarounds!• Add technical debt• May introduce other issues• Never get replaced with true solutions

Photo by Jeff Eaton // cc by-sa 2.0 // https://flic.kr/p/b33rSx

@colinodell

Page 27: Debugging Effectively - SunshinePHP 2017

5. Mitigate Future Occurrences•Add an automated test• Share your new knowledge• Project documentation• Blog post• StackOverflow

• Submit patch upstream

Photo by marcokalmann // cc by-nc-nd 2.0 // https://flic.kr/p/4CqLMQ

@colinodell

Page 29: Debugging Effectively - SunshinePHP 2017

Long-Term Results

• Gain experience• Learn how the system works• Build heuristics• Boost confidence

Photo by Glenn Beltz // cc by 2.0 // https://flic.kr/p/i7Csdx

@colinodell

Page 31: Debugging Effectively - SunshinePHP 2017

Two essential tools

• Integrated development environment (IDE)• Interactive debugger

Photo by florianric // cc by 2.0 // https://flic.kr/p/c4QJzC

@colinodell

Page 32: Debugging Effectively - SunshinePHP 2017

Integrated Development Environment•Minimum features:•Syntax highlighting•Auto-completion•Fast code navigation•Debugger

Photo by florianric // cc by 2.0 // https://flic.kr/p/c4QJzC

@colinodell

Page 33: Debugging Effectively - SunshinePHP 2017

Interactive Debugger

•Pause code execution•Breakpoints•Conditional breakpoints

•Step through execution•Examine variables•Explore call stack

Photo by florianric // cc by 2.0 // https://flic.kr/p/c4QJzC

@colinodell

Page 34: Debugging Effectively - SunshinePHP 2017

@colinodell

Page 36: Debugging Effectively - SunshinePHP 2017

1. Trace backwards•Use a debugger• Identify source of error•Establish context•Work backwards

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

@colinodell

Page 37: Debugging Effectively - SunshinePHP 2017

1. Trace backwards•Use a debugger• Identify source of error•Establish context•Work backwards

a()

b()

c()

d()

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

Page 38: Debugging Effectively - SunshinePHP 2017

1. Trace backwards•Use a debugger• Identify source of error•Establish context•Work backwards

a()

b()

c()

d()

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

Page 39: Debugging Effectively - SunshinePHP 2017

1. Trace backwards•Use a debugger• Identify source of error•Establish context•Work backwards

a()

b()

c()

d()

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

Page 40: Debugging Effectively - SunshinePHP 2017

1. Trace backwards•Use a debugger• Identify source of error•Establish context•Work backwards

a()

b()

c()

d()

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

Page 41: Debugging Effectively - SunshinePHP 2017

1. Trace backwards•Use a debugger• Identify source of error•Establish context•Work backwards

a()

b()

c()

d()

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

Page 42: Debugging Effectively - SunshinePHP 2017

2. Trace forwards•Opposite direction•Problematic lineisn’t known•Use debugger or logging

a()

b()

c()

d()

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

Page 43: Debugging Effectively - SunshinePHP 2017

2. Trace forwards•Opposite direction•Problematic lineisn’t known•Use debugger or logging

a()

b()

c()

d()

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

Page 44: Debugging Effectively - SunshinePHP 2017

2. Trace forwards•Opposite direction•Problematic lineisn’t known•Use debugger or logging

a()

b()

c()

d()

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

Page 45: Debugging Effectively - SunshinePHP 2017

2. Trace forwards•Opposite direction•Problematic lineisn’t known•Use debugger or logging

a()

b()

c()

d()

Photo by Shawn Harquail // cc by-nc 2.0 // https://flic.kr/p/npxFVw

Page 46: Debugging Effectively - SunshinePHP 2017

3. Divide & Conquer• Identify different code sections• Set breakpoints at the boundaries• Isolate issue to one particular area• Focus efforts on that area

@colinodell

Page 47: Debugging Effectively - SunshinePHP 2017

@colinodell

Page 48: Debugging Effectively - SunshinePHP 2017

@colinodell

Page 49: Debugging Effectively - SunshinePHP 2017

@colinodell

Page 50: Debugging Effectively - SunshinePHP 2017

X@colinodell

Page 51: Debugging Effectively - SunshinePHP 2017

@colinodell

Page 52: Debugging Effectively - SunshinePHP 2017

4. Use tools•Variable dumps•Debug toolbars•Console utility•Profilers•git bisect

•netcat•curl• strace•etc.

Photo by florianric // cc by 2.0 // https://flic.kr/p/c4QJzC

@colinodell

Page 56: Debugging Effectively - SunshinePHP 2017

Performance Profiling

Identify slowness:• Bottlenecks• Resource hogs• Inefficient code

Photo by Alan Stark // cc by-sa 2.0 // https://flic.kr/p/dn3qjx

Tools:• Blackfire (freemium)• New Relic (freemium)• xhprof (open-source)

@colinodell

Page 57: Debugging Effectively - SunshinePHP 2017

git bisect

v1.7 ? ? ? ? ? ? ? HEAD

Photo by unbekannt270 // cc by 2.0 // https://flic.kr/p/oHReqm

@colinodell

Page 58: Debugging Effectively - SunshinePHP 2017

git bisect

v1.7 ? ? ? ? ? ? ? HEAD

Photo by unbekannt270 // cc by 2.0 // https://flic.kr/p/oHReqm

@colinodell

Page 59: Debugging Effectively - SunshinePHP 2017

git bisect

v1.7 ? ? ? BAD ? ? ? HEAD

Photo by unbekannt270 // cc by 2.0 // https://flic.kr/p/oHReqm

@colinodell

Page 60: Debugging Effectively - SunshinePHP 2017

git bisect

v1.7 ? ? ? BAD BAD BAD BAD HEAD

Photo by unbekannt270 // cc by 2.0 // https://flic.kr/p/oHReqm

@colinodell

Page 61: Debugging Effectively - SunshinePHP 2017

git bisect

v1.7 ? GOOD ? BAD BAD BAD BAD HEAD

Photo by unbekannt270 // cc by 2.0 // https://flic.kr/p/oHReqm

@colinodell

Page 62: Debugging Effectively - SunshinePHP 2017

git bisect

v1.7 GOOD GOOD ? BAD BAD BAD BAD HEAD

Photo by unbekannt270 // cc by 2.0 // https://flic.kr/p/oHReqm

@colinodell

Page 63: Debugging Effectively - SunshinePHP 2017

git bisect

v1.7 GOOD GOOD X BAD BAD BAD BAD HEAD

Photo by unbekannt270 // cc by 2.0 // https://flic.kr/p/oHReqm

abcd123 is the first bad commit @colinodell

Page 67: Debugging Effectively - SunshinePHP 2017

5. Get help•RTFM / RTFD•Project forums or issue queue• StackOverflow, IRC, etc.•Ask a colleague• Expert in that area• Senior developer

•Rubber ducking

Photo by Hiromitsu Morimoto // cc by-sa 2.0 // https://flic.kr/p/6Vzzaa

@colinodell

Page 68: Debugging Effectively - SunshinePHP 2017

6. Take a break

Photo by Kristina Alexadnerson // cc by-nc-nd 2.0 // https://flic.kr/p/cFEcDC

• Clear your mind; start fresh• Forget invalid assumptions• Recharge your batteries• Let your subconscious work on it

@colinodell

Page 69: Debugging Effectively - SunshinePHP 2017

Four things to walk away with

1. Computers aren’t random,and neither are bugs

2. Persistence will always pay off3. Don’t be afraid to dive deep4. Don’t make assumptions or

take things for granted

Photo by Kristina Alexadnerson // cc by-nc-nd 2.0 // https://flic.kr/p/dvEpfY

@colinodell

Page 71: Debugging Effectively - SunshinePHP 2017

Learn More• https://web.duke.edu/cps001/notes/Debugging.pdf• http://www.fiveminutegeekshow.com/20• http://blog.codeunion.io/2014/09/03/teaching-novices-how-to-debug-co

de/• https://www.jetbrains.com/phpstorm/help/debugging.html• http://www.sitepoint.com/debugging-git-blame-bisect/• http://unix.stackexchange.com/a/50099/80744• http://codeception.com/docs/01-Introduction• http://chadfowler.com/blog/2014/01/26/the-magic-of-strace/ • http://c2.com/cgi/wiki?RubberDucking

Photo by Samantha Marx // cc by 2.0 // https://flic.kr/p/8KrU1R

@colinodell