Your SlideShare is downloading. ×
  • Like
Automate Debugging with git bisect
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Automate Debugging with git bisect

  • 788 views
Published

Even with the best agile development practices, bugs sometimes slip in. You don't want to manually wade through hundreds of commits and thousands or tens of thousands of lines of code to find your …

Even with the best agile development practices, bugs sometimes slip in. You don't want to manually wade through hundreds of commits and thousands or tens of thousands of lines of code to find your bug. See how find your bug fast using Git, the best (and free) version control software tool. If you are still using CVS, Subversion, or costly commercial version control, you are missing out.

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
788
On SlideShare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
24
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. CamillesCareer@gmail.com              1   Automated Debugging with   git bisect   TDD Camille  Bell   Agile  Coach  /  Rails  Developer   CamillesCareer@gmail.com   Twi3er  @agilecamille   h6p://www.slideshare.net/Camille_Bell/  
  • 2. CamillesCareer@gmail.com              2   How  do  you  find  a  bug  in  a  large     code  base  with  lots  of  commits?   1st   2nd   3rd   4th   97th   98th   99th   100th  
  • 3. CamillesCareer@gmail.com              3   Debugging  OpNons   •  Manually  inspect  all  the  code  and  hope  you   find  the  bug    " •  Logically  eliminate  some  of  the  code,  inspect   all  the  rest  and  hope  you  find  the  bug       •  Use  automaNon  to  find  your  bug  fast      
  • 4. CamillesCareer@gmail.com              4   Steps  to  Target  the  Buggy  Code   •  Create  new  or  use  an  exisNng  automated  bug   detector  to  disNnguish  between  bug  free  code   from  buggy  code  (usually  an  automated  test)   •  Determine  the  bug  commit  range   –  Use  git log    if  needed   •  Use  git bisect –  Run  the  test   –  Use    git diff    to  narrow  bug  to  code  lines  
  • 5. CamillesCareer@gmail.com              5   AutomaNng  Bug  DetecNon   •  Perhaps  you  already  have  a  good  automated  test,   but  weren’t  running  it  with  every  commit.  Use   that  test  (and  set  up  a  CI  server  soon).   •  If  not  create  a  new  test  that  should  fail  (RED)   when  the  bug  is  present  and  pass  (GREEN)  when   the  bug  is  fixed.     –  Write  the  test  in  whatever  test  language  makes  sense   (e.g.  RSpec  for  low  level  Ruby,  Cucumber  high  level   behavior,  Jasmine  for  JavaScript,  JUnit  for  Java,  NUnit   for  C#,  etc.)  
  • 6. CamillesCareer@gmail.com              6   Verify  the  Test  Catches  the  Bug   •  Run  the  test  on  the  latest  buggy  code  and   watch  it  fail  (RED).   •  Go  back  to  a  known  good  commit,  run  the  test   and  watch  it  pass  (GREEN).  
  • 7. CamillesCareer@gmail.com              7   $ rspec . –color F. Failures: 1) Account depositing to account produces the correct balance when 9 dollars is deposited the balance is 10 dollars Failure/Error: @account.balance.should == 1000 expected: 1000 got: 999.9999 (using ==) # ./account_spec.rb:15:in `block (3 levels) in <top (required)>' Finished in 0.00058 seconds 2 examples, 1 failure Failed examples: rspec ./account_spec.rb:12 # Account depositing to account produces the correct balance when 9 dollars is deposited the balance is 10 dollars $ Verifying  Failure  on    Known  Bad  Commit    
  • 8. CamillesCareer@gmail.com              8   $ rspec . –color .. Finished in 0.00047 seconds 2 examples, 0 failures $ Verifying  Success  on  a   Known  Good  Commit    
  • 9. CamillesCareer@gmail.com              9   Running    git bisect   •  Start  with  a  known  bad  git repository   –  $  git bisect start –  $  git bisect bad –  $  git bisect good <good_commit>   •  Run  your  tests   •  If  the  test  passes   –  $  git bisect good •  If  the  test  fails   –  $ git bisect bad •  Repeat  unNl  you  find  the  bad  commit Use  either  tag    or  git  commit  #   If  needed  checkout  a   bad  git  commit  #  
  • 10. CamillesCareer@gmail.com              10   """"" """ Determine  the  Bug  Commit  Range:   •     The  last  known  commit  without  the  bug   •     The  first  commit  aeer  the  bug  observed   StarNng   Good   Commit   StarNng   Bad   Commit   Bug  Inserted  Within     These  8  Commits  
  • 11. CamillesCareer@gmail.com              11   git bisect does  a  binary   search  through  your  commit  range.   """"" """ Good     Commit   Bad     Commit   bisect     StarNng       Commit   bisect begins  with  the  commit  halfway  between   the  known  good  commit  and  the  known  bad  commit  
  • 12. CamillesCareer@gmail.com              12   Assume  the  1st  test  on  bisect failed.   """"" """ Good     Commit   Bad     Commit   bisect     Next       Commit    Then    bisect would  select  the  commit  between  the   known  good  commit  and  the  last  bad  bisect   Bad     Commit   Can  ignore   these  Commits   Bug  inserted  Within     These  4  Commits  
  • 13. CamillesCareer@gmail.com              13   Assume  the  2nd  test  on  bisect passed.   """ """ Good     Commit   Bad     Commit    Then    bisect would  select  the  commit  between  the   last  known  good  commit  and  the  last  bad  bisect   Bad     Commit   Can  ignore   these  Commits   Bug  inserted  Within     These  2  Commits   Can  ignore   these  Commits   Good     Commit   bisect     Next       Commit  
  • 14. CamillesCareer@gmail.com              14   If  the  3rd  test  on  bisect failed.   """ """ Good     Commit   Bad     Commit    Then  that  commit  is  where  the  bug  was  inserted.     Bad     Commit   Can  ignore   these  Commits   Bug  inserted  Within     These  2  Commits   Can  ignore   these  Commits   Good     Commit   Final   Commit       Failed   Test  
  • 15. CamillesCareer@gmail.com              15   If  the  3rd  test  on  bisect passed.   """"" Good     Commit   Bad     Commit    Then  the  next  commit  is  where  the  bug  was  inserted.     Bad     Commit   Can  ignore   these  Commits   Bug  inserted  Within     These  2  Commits   Can  ignore   these  Commits   Good     Commit   Final   Commit       Passed   Test  
  • 16. CamillesCareer@gmail.com              16   Example  Test   require_relaNve  'account'   describe  Account  do      before  do          @starNng_balance_in_pennies  =  100          @account  =  Account.new(@starNng_balance_in_pennies)              end      context  "deposiNng  to  account  produces  the  correct  balance"  do          it  "when  9  dollars  is  deposited  the  balance  is  10  dollars"  do                  deposit_amount_in_pennies  =  900              @account.deposit(deposit_amount_in_pennies)              @account.balance.should  ==  1000          end      end   end  
  • 17. CamillesCareer@gmail.com              17   SomeNmes  the  Commit  Messages     from  git log Pinpoint  the  Bug   $ git log --pretty="%h - %s" 561bb3a - added withdrawal and deposit messages 6ca7ee1 - added error c546d1f - added to_s 1974592 - added withdrawal 7a8c508 - Initial commit But  usually  the  log  only  provides  a  range   Known   Good   Commit   Known   Bad   Commit  
  • 18. CamillesCareer@gmail.com              18   StarNng  up  git bisect with   Test  on  the  Middle  git Commit   $ git bisect start Already on 'master’ $ git bisect bad $ git bisect good 7a8c508 Bisecting: 1 revision left to test after this (roughly 1 step) [c546d1f89b5b0c14ab160e227fc83d62fb780e6f] added to_s $ rspec . --color .. Finished in 0.00071 seconds 2 examples, 0 failures $ git bisect good Bisecting: 0 revisions left to test after this (roughly 0 steps) [6ca7ee1909bf0b3f7344feee25a5b44a97602e2c] added error Known  Good  Commit   Known  Bad  Commit   If  the  tests  pass,     Tell    git bisect good Otherwise  git bisect bad C   O   M   M   I   T  
  • 19. CamillesCareer@gmail.com              19   Test  on  the  final  git commit   $ rspec . --color F. Failures: 1) Account depositing to account produces the correct balance when 9 dollars is deposited the balance is 10 dollars Failure/Error: @account.balance.should == 1000 expected: 1000 got: 999.9999 (using ==) # ./account_spec.rb:15:in `block (3 levels) in <top (required)>' Finished in 0.00053 seconds 2 examples, 1 failure Failed examples: rspec ./account_spec.rb:12 # Account depositing to account produces the correct balance when 9 dollars is deposited the balance is 10 dollars $
  • 20. CamillesCareer@gmail.com              20   $ git diff c546d1f 6ca7ee1 diff --git a/account.rb b/account.rb index a979e55..0a572ef 100644 --- a/account.rb +++ b/account.rb @@ -5,7 +5,7 @@ class Account end def deposit(new_deposit) - @balance += new_deposit + @balance += (new_deposit - 0.0001) end def withdrawl(new_withdrawl) $ git diff Targets  the  Bug  Even  More   Good  Commit   Just  Before  Bug   Commit  Where   Bug  First  Appeared   Bug  inserted  in  one  or   more  of  the  +  lines.  
  • 21. CamillesCareer@gmail.com              21   Thank You for Listening   Camille  Bell   Agile  Coach  /  Rails  Developer   CamillesCareer@gmail.com   Twi3er  @agilecamille   h6p://www.slideshare.net/Camille_Bell/