SlideShare a Scribd company logo
1 of 67
Download to read offline
DEBUGGING
R U L E S A N D TO O L S
ian barber - http://phpir.com - @ianbarber
I did X
I wanted Y
Instead I got Z
http://www.debuggingrules.com
RULE 1
UNDERSTAND
THE SYSTEM
Bug
Wiki       Tracker   Frame
                     work




          RTFM       PHP
                     Doc



php.net
$field = $document->getField($fieldName);

if ($field->storeTermVector) {
  /**
   * @todo term vector storing support
   */
   require_once
         'Zend/Search/Lucene/Exception.php';
   throw new Zend_Search_Lucene_Exception
   ('Store term vector functionality is not
      supported yet.');
}
Komodo



Eclipse             Zend
                    Studio
          TOOLS

 PHP                 Net
Storm      Text     Beans
           Mate
RULE 2
MAKE IT
FAIL
Recreate And
Automate
PHP Unit
SimpleTest
Selenium
PHP Slim
JMeter
Ab
Time
    Load                 Timing

                                   User

Server
              CONTROL
 Env
              VARIABLES
                                  Request

     Client               DB
                         State
               Session
[root@localhost ~]# pear channel-discover pear.phpunit.de
[root@localhost ~]# pear install phpunit/PHPUnit

class Test_User extends
               PHPUnit_Framework_TestCase {
 public function testUpdate() {
   $r = ("a", "b");
   try {
     $u = User::fetch($this->newName);
     $result = $u->update($r);
   } catch (Id_Exception $e) {
     $this->fail($e->getMessage());
   }
   $this->assertEquals($r, $u->getRoles());
 }
}
http://seleniumhq.org/
class Example extends
           PHPUnit_Extensions_SeleniumTestCase {
  protected function setUp() {
    $this->setBrowser("*chrome");
    $this->setBrowserUrl("http://general.dev/");
  }

    public function testMyTestCase() {
      $this->open("/");
      $this->select("locale", "label=de");
      $this->waitForPageToLoad("30000");
      $this->assertTrue($this->isTextPresent(
                        "Datenbank-Einrichtung"));
    }
}
http://jakarta.apache.org/jmeter/
RULE 3
QUIT THINKING
AND LOOK
if($this->hasRoles) {
  $this->deleteRoles();
}

try {
  foreach($submittedRoles as $role) {
    $this->addRole($role);
  }
} catch(Identity_Exception $e) {
  $this->log->warn('Role add failed.');
  throw new Service_Exception_BadRequest(
                   'Cannot add user role');
}
Instrumentation:
Inspect or Report
Xdebug
      http://www.xdebug.org

[root@localhost ~]# pecl install xdebug

zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.profiler_enable=1
xdebug.profiler_output_dir=/tmp
xdebug.auto_trace=1
xdebug.collect_params=4
Key
                                        Web Server
                                        PHP Script
                         Key
Debugging Client                         XDebug



                   Debugging Commands
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.remote_host=192.168.192.1
#xdebug.remote_connect_back=1
[root@localhost ~]# lsof -p 4365
COMMAND   USER     FD    TYPE   DEVICE   NAME
httpd     apache   mem   REG    253,0    /lib64/libssl.so.0.9.8e
httpd     apache   mem   REG    253,0    /usr/lib64/php/modules/xdebug.so
httpd     apache   mem   REG    253,0    /usr/lib64/libsqlite3.so.0.8.6




[root@localhost ~]# strace -cp 4365
Process 6910 attached - interrupt to quit
Process 6910 detached
% time     seconds usecs/call      calls    errors           syscall
------ ----------- ----------- --------- ---------           -------------
 36.91    0.037307         466        80                     getdents
 30.07    0.030393         950        32         7           access
 17.04    0.017224         154       112        10           open
  5.08    0.005136          12       444         9           lstat
  3.87    0.003910          18       213         1           read
  3.04    0.003071          29       107                     close
  2.57    0.002598        1299         2                     writev
  0.78    0.000785           1       631                     stat
[root@localhost ~]# strace -Tp 4365
Process 6910 attached - interrupt to quit
epoll_wait(16, {{EPOLLIN, {u32=31389672, u64=47128707528680}}},
      2, 10000) = 1 <6.926140>
accept(4, {sa_family=AF_INET6, sin6_port=htons(64930), inet_pton
      (AF_INET6, "::ffff:192.168.192.1", &sin6_addr),
      sin6_flowinfo=0, sin6_scope_id=0}, [47128676139036]) = 17
      <0.000094>
fcntl(17, F_SETFL, O_RDWR|O_NONBLOCK)   = 0 <0.000035>
read(17,
  "POST / HTTP/1.1rnHost: general.d"...,
   8000) = 522 <0.000044>
stat("/mnt/hgfs/habari/htdocs/", {st_mode=S_IFDIR|0755,
      st_size=408, ...}) = 0 <0.000527>
open("/mnt/hgfs/habari/htdocs/.htaccess",
   O_RDONLY) = 18 <0.000457>
fcntl(17, F_SETFL, O_RDWR|O_NONBLOCK)   = 0 <0.000037>
[root@localhost ~]# strace -Tp 4365
Process 6910 attached - interrupt to quit
epoll_wait(16, {{EPOLLIN, {u32=31389672, u64=47128707528680}}},
      2, 10000) = 1 <6.926140>
accept(4, {sa_family=AF_INET6, sin6_port=htons(64930), inet_pton
      (AF_INET6, "::ffff:192.168.192.1", &sin6_addr),
      sin6_flowinfo=0, sin6_scope_id=0}, [47128676139036]) = 17
      <0.000094>
fcntl(17, F_SETFL, O_RDWR|O_NONBLOCK)   = 0 <0.000035>
read(17,
   "POST / HTTP/1.1rnHost: general.d"...,
    8000) = 522 <0.000044>
stat("/mnt/hgfs/habari/htdocs/", {st_mode=S_IFDIR|0755,
      st_size=408, ...}) = 0 <0.000527>
open("/mnt/hgfs/habari/htdocs/.htaccess",
    O_RDONLY) = 18 <0.000457>
Zend                    Drupal
    Log                    syslog
              sfLogger
                                    Kohana
                                     Log


error_log("Message for the PHP log")
error_log("Log to email", 1, "me@foo.com");
error_log("Log to a file",3, "/tmp/m.log");
error_log("Message for the SAPI log", 4);
MQ           Syslog   File



          LOGGING
          SYSTEM

Gearman     Database   Pipe
FirePHP
[root@localhost ~]# pear channel-discover pear.firephp.org
[root@localhost ~]# pear install firephp/FirePHPCore

require_once('FirePHPCore/FirePHP.class.php');
ob_start();
$firephp = FirePHP::getInstance(true);
doStuff($firephp);
$firephp->warn('Done Stuff');
$firephp->error('An error!');
$firephp->log($_GET);
ob_end_flush();

function doStuff($firephp) {
    $firephp->trace('Stuff Backtrace');
    echo "This page intentionally blank";
}
RULE 4
DIVIDE AND
CONQUER
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="./TestHelper.php"
colors="true">
 <testsuite name="Commonlib Tests">
  <directory>./library/Cl/</directory>
  <directory>./library/Sso/</directory>
 </testsuite>
<filter>
 <whitelist>
  <directory suffix=".php">../Sso/</directory>
  <directory suffix=".php">../Cl/</directory>
</whitelist>
</filter>
</phpunit>
Folder Root

          CL          SSO


      Auth       Client      Model    User


Adapter      Plugin   Exception Abstract


SSO          SFDC         Gearman
<?php

$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction(
            "allow_access", "allowAccess");
$worker->addFunction(
            "deny_access", "denyAccess");

while ($worker->work());
Git Bisect
git bisect start
git bisect bad
git bisect good <known good rev>

git bisect ?

git bisect reset
good                                      bad
                          1
 Request                                       View
                              2

  Front                           3
Controller                            Plugin


  Input                       Model
  Filter

             Controller
Firewall


  Cache


Web Server


 Database
Tamper
                          Data
   Curl


             Firewall
Wireshark
              Cache       Netcat


            Web Server
MySQL
Proxy                    Xdebug
             Database
Tamper Data
https://addons.mozilla.org/firefox/addon/966
Wireshark
http://www.wireshark.org/
[root@localhost ~]# { echo -ne "HTTP/1.0 200 OKrn
rn"; cat test.html; } | nc -l 8080
GET / HTTP/1.1
User-Agent: curl/7.19.7 (i386-apple-darwin10.0.0)
libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3
Host: general.dev:8080
Accept: */*



[root@localhost ~]# curl http://general.dev:8080 -v
* About to connect() to general.dev port 8080 (#0)
*   Trying 192.168.192.129... connected
* Connected to general.dev (192.168.192.129) port
8080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (i386-apple-darwin10.0.0)
libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3
> Host: general.dev:8080
local log_file = 'mysql.log'
local fh = io.open(log_file, "a+")

function read_query( packet )
  if string.byte(packet) == proxy.COM_QUERY
  then
    local query = string.sub(packet, 2)
    fh:write( string.format("%sn",query))
    fh:flush()
  end
end


     MySQL Proxy
RULE 5
CHANGE ONE
THING AT
A TIME
[root@localhost ~]#: svn st
M       index.php


[root@localhost ~]#: git stash save
Saved working directory and index state WIP
on master: 0e22fdd Initial checkin
HEAD is now at 0e22fdd Initial checkin

[root@localhost ~]#: git status
# On branch master
nothing to commit (working directory clean)



      Source Control
[root@localhost ~]#: svn log .
-------------------------------------------
r4341 | rickc | 2010-09-24 03:01 | 3 lines

Don't test if Post::tags is empty before
getting tags. There may be a performance
hit for this. It can be dealt with if it is
noticable. Fixes ticket #1235. Props to ilo
for the patch.

 Note that Post still needs to be updated to
 use real Tags, not an array of slug/label
 pairs as the tags member.
--------------------------------------------

      Source Control
Known Good
[root@localhost ~]# diff -yw web.conf web2.conf
<VirtualHost *:80>           <VirtualHost *:80>
  ServerAdmin root@e.com      ServerAdmin root@e.com
  DocumentRoot /www/htdocs |   DocumentRoot /www/hdocs
  ServerName general.dev       ServerName general.dev
  ErrorLog logs/error_log      ErrorLog logs/error_log
</VirtualHost>               </VirtualHost>
RULE 6
KEEP AN
AUDIT TRAIL
Hot Key Log
http://www.blacktree.com/
http://do.davebsd.com/
https://launchpad.net/mb
http://simplenoteapp.com/
Backpack Journal
http://backpackit.com/
[root@localhost htdocs]# history 20
  365 ls /mnt/hgfs/habari/
  366 ls
  367 vi /etc/httpd/conf.d/web.conf
  368 setenforce 0
  369 /etc/init.d/httpd restart
  370 vi /var/log/httpd/error_log
  371 cd /mnt/hgfs/habari/
  372 ls
  373 cd htdocs/
  374 ls
  375 cd scripts/
  376 ls
  377 cd ..
  378 ls
  379 vi /etc/php.ini
RULE 7
CHECK THE
PLUG
Sources of Plugs
[root@localhost ~]# apachectl -M
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
          [root@localhost ~]# whoami
 auth_basic_module (shared)
           root
 auth_digest_module (shared)
          [root@localhost ~]# ifconfig
 authn_file_module (shared)
           eth0       Link encap:Ethernet HWad
 authn_alias_module (shared)
 authn_anon_module inet addr:192.168.192.129
                    (shared)
                   inet6 addr: fe80::20c:29ff:
authn_dbm_module (shared)
RULE 8
GET A FRESH
VIEW
if(!is_string($i)) {
  throw new Xapian_Exception('Incorrect
   query type, expecting string or array of
   strings');
}

$q = $this->getParser()->parse_query($i);
if(!is_string($i)) {
  throw new Xapian_Exception('Incorrect
   query type, expecting string or array of
   strings');
}

$q = $this->getParser()->parse_query($i,
                 FLAG_SPELLING_CORRECTION);
“Grovelling is not
a substitute for
doing your
homework”
- ESR
http://www.catb.org/esr/faqs/smart-questions.html
RULE 9
IF YOU DIDN’T
FIX IT -
IT AIN’T FIXED
Five Whys
           The page is blank: Why?
      There is a fatal error: Why?
No mb_check_encoding(): Why?
   mbstring is not installed: Why?
   It isn’t part of the build: Why?
It was setup for another project.
The Rules
1. Understand The System
2. Make It Fail
3. Quit Thinking And Look
4. Divide And Conquer
5. Change One Thing At A Time
6. Keep An Audit Trail
7. Check The Plug
8. Get A Fresh View
9. If You Didn’t Fix It, It Ain’t Fixed
Questions

            ?
Image Credits
When men were men and wore white coats - by Jitze
http://www.flickr.com/photos/jitze1942/4292084185/
Vacuum Tube Etch-A-Sketch - by Jurvetson
http://www.flickr.com/photos/jurvetson/197768962/
Classic - by Oskay
http://www.flickr.com/photos/oskay/1364147095
Firmware Bug - by Oskay
http://www.flickr.com/photos/oskay/1364148351
Ready to hop - by Oskay
http://www.flickr.com/photos/oskay/1364153441/
Albino - by Oskay
http://www.flickr.com/photos/oskay/1364143833
Coming Through! - by Oskay
http://www.flickr.com/photos/oskay/1364147807
Tux the Pinguin - by Patrick van der Velden
From the photographer’s private collection
THANKANDTOOLS
DEBUGGING: RULES
                 YOU
   http://joind.in/2173

More Related Content

What's hot

Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)julien pauli
 
Стажировка 2016-07-27 02 Денис Нелюбин. PostgreSQL и jsonb
Стажировка 2016-07-27 02 Денис Нелюбин. PostgreSQL и jsonbСтажировка 2016-07-27 02 Денис Нелюбин. PostgreSQL и jsonb
Стажировка 2016-07-27 02 Денис Нелюбин. PostgreSQL и jsonbSmartTools
 
Guarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous TestingGuarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous TestingEric Hogue
 
Using ngx_lua in UPYUN
Using ngx_lua in UPYUNUsing ngx_lua in UPYUN
Using ngx_lua in UPYUNCong Zhang
 
ZeroMQ: Messaging Made Simple
ZeroMQ: Messaging Made SimpleZeroMQ: Messaging Made Simple
ZeroMQ: Messaging Made SimpleIan Barber
 
GHCソースコード読みのススメ
GHCソースコード読みのススメGHCソースコード読みのススメ
GHCソースコード読みのススメKiwamu Okabe
 
Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )Joseph Scott
 
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaRoll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaJon Moore
 
Redis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your applicationRedis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your applicationrjsmelo
 
Puppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the ForgePuppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the ForgePuppet
 
Relayd: a load balancer for OpenBSD
Relayd: a load balancer for OpenBSD Relayd: a load balancer for OpenBSD
Relayd: a load balancer for OpenBSD Giovanni Bechis
 
How to stand on the shoulders of giants
How to stand on the shoulders of giantsHow to stand on the shoulders of giants
How to stand on the shoulders of giantsIan Barber
 
ZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionIan Barber
 
Vladimir Vorontsov - Splitting, smuggling and cache poisoning come back
Vladimir Vorontsov - Splitting, smuggling and cache poisoning come backVladimir Vorontsov - Splitting, smuggling and cache poisoning come back
Vladimir Vorontsov - Splitting, smuggling and cache poisoning come backDefconRussia
 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in PerlLaurent Dami
 

What's hot (20)

OWASP Proxy
OWASP ProxyOWASP Proxy
OWASP Proxy
 
Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)
 
Стажировка 2016-07-27 02 Денис Нелюбин. PostgreSQL и jsonb
Стажировка 2016-07-27 02 Денис Нелюбин. PostgreSQL и jsonbСтажировка 2016-07-27 02 Денис Нелюбин. PostgreSQL и jsonb
Стажировка 2016-07-27 02 Денис Нелюбин. PostgreSQL и jsonb
 
Guarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous TestingGuarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous Testing
 
Gevent rabbit rpc
Gevent rabbit rpcGevent rabbit rpc
Gevent rabbit rpc
 
Using ngx_lua in UPYUN
Using ngx_lua in UPYUNUsing ngx_lua in UPYUN
Using ngx_lua in UPYUN
 
Perl 6 by example
Perl 6 by examplePerl 6 by example
Perl 6 by example
 
ZeroMQ: Messaging Made Simple
ZeroMQ: Messaging Made SimpleZeroMQ: Messaging Made Simple
ZeroMQ: Messaging Made Simple
 
GHCソースコード読みのススメ
GHCソースコード読みのススメGHCソースコード読みのススメ
GHCソースコード読みのススメ
 
Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )Anatomy of a PHP Request ( UTOSC 2010 )
Anatomy of a PHP Request ( UTOSC 2010 )
 
Roll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and LuaRoll Your Own API Management Platform with nginx and Lua
Roll Your Own API Management Platform with nginx and Lua
 
Redis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your applicationRedis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your application
 
Puppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the ForgePuppet Module Reusability - What I Learned from Shipping to the Forge
Puppet Module Reusability - What I Learned from Shipping to the Forge
 
Cooking pies with Celery
Cooking pies with CeleryCooking pies with Celery
Cooking pies with Celery
 
Relayd: a load balancer for OpenBSD
Relayd: a load balancer for OpenBSD Relayd: a load balancer for OpenBSD
Relayd: a load balancer for OpenBSD
 
How to stand on the shoulders of giants
How to stand on the shoulders of giantsHow to stand on the shoulders of giants
How to stand on the shoulders of giants
 
ZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 VersionZeroMQ Is The Answer: DPC 11 Version
ZeroMQ Is The Answer: DPC 11 Version
 
PHP5.5 is Here
PHP5.5 is HerePHP5.5 is Here
PHP5.5 is Here
 
Vladimir Vorontsov - Splitting, smuggling and cache poisoning come back
Vladimir Vorontsov - Splitting, smuggling and cache poisoning come backVladimir Vorontsov - Splitting, smuggling and cache poisoning come back
Vladimir Vorontsov - Splitting, smuggling and cache poisoning come back
 
Working with databases in Perl
Working with databases in PerlWorking with databases in Perl
Working with databases in Perl
 

Viewers also liked

Basic tool kit to open computer
Basic tool kit to open computerBasic tool kit to open computer
Basic tool kit to open computerM Kimi
 
Software Requirement Specification
Software Requirement SpecificationSoftware Requirement Specification
Software Requirement SpecificationVishal Singh
 
Software requirements specification
Software  requirements specificationSoftware  requirements specification
Software requirements specificationKrishnasai Gudavalli
 
Embedded system-Introduction to development cycle and development tool
Embedded system-Introduction to development cycle and development  toolEmbedded system-Introduction to development cycle and development  tool
Embedded system-Introduction to development cycle and development toolPantech ProLabs India Pvt Ltd
 
Embedded System Tools ppt
Embedded System Tools  pptEmbedded System Tools  ppt
Embedded System Tools pptHalai Hansika
 
Software Engineering ppt
Software Engineering pptSoftware Engineering ppt
Software Engineering pptshruths2890
 

Viewers also liked (8)

Basic tool kit to open computer
Basic tool kit to open computerBasic tool kit to open computer
Basic tool kit to open computer
 
Unit 6
Unit 6Unit 6
Unit 6
 
E.s unit 6
E.s unit 6E.s unit 6
E.s unit 6
 
Software Requirement Specification
Software Requirement SpecificationSoftware Requirement Specification
Software Requirement Specification
 
Software requirements specification
Software  requirements specificationSoftware  requirements specification
Software requirements specification
 
Embedded system-Introduction to development cycle and development tool
Embedded system-Introduction to development cycle and development  toolEmbedded system-Introduction to development cycle and development  tool
Embedded system-Introduction to development cycle and development tool
 
Embedded System Tools ppt
Embedded System Tools  pptEmbedded System Tools  ppt
Embedded System Tools ppt
 
Software Engineering ppt
Software Engineering pptSoftware Engineering ppt
Software Engineering ppt
 

Similar to Debugging: Rules & Tools

Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionDebugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionIan Barber
 
Heavy Web Optimization: Backend
Heavy Web Optimization: BackendHeavy Web Optimization: Backend
Heavy Web Optimization: BackendVõ Duy Tuấn
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统yiditushe
 
The why and how of moving to PHP 5.4/5.5
The why and how of moving to PHP 5.4/5.5The why and how of moving to PHP 5.4/5.5
The why and how of moving to PHP 5.4/5.5Wim Godden
 
4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebookguoqing75
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐいHisateru Tanaka
 
Reutov, yunusov, nagibin random numbers take ii
Reutov, yunusov, nagibin   random numbers take iiReutov, yunusov, nagibin   random numbers take ii
Reutov, yunusov, nagibin random numbers take iiDefconRussia
 
PHP Backdoor: The rise of the vuln
PHP Backdoor: The rise of the vulnPHP Backdoor: The rise of the vuln
PHP Backdoor: The rise of the vulnSandro Zaccarini
 
Session Server - Maintaing State between several Servers
Session Server - Maintaing State between several ServersSession Server - Maintaing State between several Servers
Session Server - Maintaing State between several ServersStephan Schmidt
 
Ch ch-changes cake php2
Ch ch-changes cake php2Ch ch-changes cake php2
Ch ch-changes cake php2markstory
 
Teaching Your WAF New Tricks
Teaching Your WAF New TricksTeaching Your WAF New Tricks
Teaching Your WAF New TricksRobert Rowley
 
PHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP LimogesPHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP Limoges✅ William Pinaud
 
How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]Devon Bernard
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest UpdatesIftekhar Eather
 
X64服务器 lnmp服务器部署标准 new
X64服务器 lnmp服务器部署标准 newX64服务器 lnmp服务器部署标准 new
X64服务器 lnmp服务器部署标准 newYiwei Ma
 
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry PiGrâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry PiJérémy Derussé
 
An introduction to PHP 5.4
An introduction to PHP 5.4An introduction to PHP 5.4
An introduction to PHP 5.4Giovanni Derks
 

Similar to Debugging: Rules & Tools (20)

Debugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 VersionDebugging: Rules And Tools - PHPTek 11 Version
Debugging: Rules And Tools - PHPTek 11 Version
 
Heavy Web Optimization: Backend
Heavy Web Optimization: BackendHeavy Web Optimization: Backend
Heavy Web Optimization: Backend
 
Facebook的缓存系统
Facebook的缓存系统Facebook的缓存系统
Facebook的缓存系统
 
The why and how of moving to PHP 5.4/5.5
The why and how of moving to PHP 5.4/5.5The why and how of moving to PHP 5.4/5.5
The why and how of moving to PHP 5.4/5.5
 
4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook4069180 Caching Performance Lessons From Facebook
4069180 Caching Performance Lessons From Facebook
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Reutov, yunusov, nagibin random numbers take ii
Reutov, yunusov, nagibin   random numbers take iiReutov, yunusov, nagibin   random numbers take ii
Reutov, yunusov, nagibin random numbers take ii
 
Random numbers
Random numbersRandom numbers
Random numbers
 
PHP Backdoor: The rise of the vuln
PHP Backdoor: The rise of the vulnPHP Backdoor: The rise of the vuln
PHP Backdoor: The rise of the vuln
 
Php version 5
Php version 5Php version 5
Php version 5
 
Session Server - Maintaing State between several Servers
Session Server - Maintaing State between several ServersSession Server - Maintaing State between several Servers
Session Server - Maintaing State between several Servers
 
Ch ch-changes cake php2
Ch ch-changes cake php2Ch ch-changes cake php2
Ch ch-changes cake php2
 
Teaching Your WAF New Tricks
Teaching Your WAF New TricksTeaching Your WAF New Tricks
Teaching Your WAF New Tricks
 
PHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP LimogesPHP in 2018 - Q4 - AFUP Limoges
PHP in 2018 - Q4 - AFUP Limoges
 
How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]How to Design a Great API (using flask) [ploneconf2017]
How to Design a Great API (using flask) [ploneconf2017]
 
Introducing PHP Latest Updates
Introducing PHP Latest UpdatesIntroducing PHP Latest Updates
Introducing PHP Latest Updates
 
X64服务器 lnmp服务器部署标准 new
X64服务器 lnmp服务器部署标准 newX64服务器 lnmp服务器部署标准 new
X64服务器 lnmp服务器部署标准 new
 
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry PiGrâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
Grâce aux tags Varnish, j'ai switché ma prod sur Raspberry Pi
 
An introduction to PHP 5.4
An introduction to PHP 5.4An introduction to PHP 5.4
An introduction to PHP 5.4
 
Fatc
FatcFatc
Fatc
 

More from Ian Barber

Teaching Your Machine To Find Fraudsters
Teaching Your Machine To Find FraudstersTeaching Your Machine To Find Fraudsters
Teaching Your Machine To Find FraudstersIan Barber
 
ZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 VersionZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 VersionIan Barber
 
Deployment Tactics
Deployment TacticsDeployment Tactics
Deployment TacticsIan Barber
 
In Search Of: Integrating Site Search (PHP Barcelona)
In Search Of: Integrating Site Search (PHP Barcelona)In Search Of: Integrating Site Search (PHP Barcelona)
In Search Of: Integrating Site Search (PHP Barcelona)Ian Barber
 
In Search Of... (Dutch PHP Conference 2010)
In Search Of... (Dutch PHP Conference 2010)In Search Of... (Dutch PHP Conference 2010)
In Search Of... (Dutch PHP Conference 2010)Ian Barber
 
In Search Of... integrating site search
In Search Of... integrating site search In Search Of... integrating site search
In Search Of... integrating site search Ian Barber
 
Document Classification In PHP - Slight Return
Document Classification In PHP - Slight ReturnDocument Classification In PHP - Slight Return
Document Classification In PHP - Slight ReturnIan Barber
 
Document Classification In PHP
Document Classification In PHPDocument Classification In PHP
Document Classification In PHPIan Barber
 

More from Ian Barber (8)

Teaching Your Machine To Find Fraudsters
Teaching Your Machine To Find FraudstersTeaching Your Machine To Find Fraudsters
Teaching Your Machine To Find Fraudsters
 
ZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 VersionZeroMQ Is The Answer: PHP Tek 11 Version
ZeroMQ Is The Answer: PHP Tek 11 Version
 
Deployment Tactics
Deployment TacticsDeployment Tactics
Deployment Tactics
 
In Search Of: Integrating Site Search (PHP Barcelona)
In Search Of: Integrating Site Search (PHP Barcelona)In Search Of: Integrating Site Search (PHP Barcelona)
In Search Of: Integrating Site Search (PHP Barcelona)
 
In Search Of... (Dutch PHP Conference 2010)
In Search Of... (Dutch PHP Conference 2010)In Search Of... (Dutch PHP Conference 2010)
In Search Of... (Dutch PHP Conference 2010)
 
In Search Of... integrating site search
In Search Of... integrating site search In Search Of... integrating site search
In Search Of... integrating site search
 
Document Classification In PHP - Slight Return
Document Classification In PHP - Slight ReturnDocument Classification In PHP - Slight Return
Document Classification In PHP - Slight Return
 
Document Classification In PHP
Document Classification In PHPDocument Classification In PHP
Document Classification In PHP
 

Recently uploaded

The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 

Recently uploaded (20)

The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 

Debugging: Rules & Tools

  • 1. DEBUGGING R U L E S A N D TO O L S ian barber - http://phpir.com - @ianbarber
  • 2.
  • 3. I did X I wanted Y Instead I got Z
  • 6. Bug Wiki Tracker Frame work RTFM PHP Doc php.net
  • 7. $field = $document->getField($fieldName); if ($field->storeTermVector) { /** * @todo term vector storing support */ require_once 'Zend/Search/Lucene/Exception.php'; throw new Zend_Search_Lucene_Exception ('Store term vector functionality is not supported yet.'); }
  • 8. Komodo Eclipse Zend Studio TOOLS PHP Net Storm Text Beans Mate
  • 11. Time Load Timing User Server CONTROL Env VARIABLES Request Client DB State Session
  • 12. [root@localhost ~]# pear channel-discover pear.phpunit.de [root@localhost ~]# pear install phpunit/PHPUnit class Test_User extends PHPUnit_Framework_TestCase { public function testUpdate() { $r = ("a", "b"); try { $u = User::fetch($this->newName); $result = $u->update($r); } catch (Id_Exception $e) { $this->fail($e->getMessage()); } $this->assertEquals($r, $u->getRoles()); } }
  • 14. class Example extends PHPUnit_Extensions_SeleniumTestCase { protected function setUp() { $this->setBrowser("*chrome"); $this->setBrowserUrl("http://general.dev/"); } public function testMyTestCase() { $this->open("/"); $this->select("locale", "label=de"); $this->waitForPageToLoad("30000"); $this->assertTrue($this->isTextPresent( "Datenbank-Einrichtung")); } }
  • 17. if($this->hasRoles) { $this->deleteRoles(); } try { foreach($submittedRoles as $role) { $this->addRole($role); } } catch(Identity_Exception $e) { $this->log->warn('Role add failed.'); throw new Service_Exception_BadRequest( 'Cannot add user role'); }
  • 19. Xdebug http://www.xdebug.org [root@localhost ~]# pecl install xdebug zend_extension=/usr/lib64/php/modules/xdebug.so
  • 22. Key Web Server PHP Script Key Debugging Client XDebug Debugging Commands
  • 24.
  • 25.
  • 26. [root@localhost ~]# lsof -p 4365 COMMAND USER FD TYPE DEVICE NAME httpd apache mem REG 253,0 /lib64/libssl.so.0.9.8e httpd apache mem REG 253,0 /usr/lib64/php/modules/xdebug.so httpd apache mem REG 253,0 /usr/lib64/libsqlite3.so.0.8.6 [root@localhost ~]# strace -cp 4365 Process 6910 attached - interrupt to quit Process 6910 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ------------- 36.91 0.037307 466 80 getdents 30.07 0.030393 950 32 7 access 17.04 0.017224 154 112 10 open 5.08 0.005136 12 444 9 lstat 3.87 0.003910 18 213 1 read 3.04 0.003071 29 107 close 2.57 0.002598 1299 2 writev 0.78 0.000785 1 631 stat
  • 27. [root@localhost ~]# strace -Tp 4365 Process 6910 attached - interrupt to quit epoll_wait(16, {{EPOLLIN, {u32=31389672, u64=47128707528680}}}, 2, 10000) = 1 <6.926140> accept(4, {sa_family=AF_INET6, sin6_port=htons(64930), inet_pton (AF_INET6, "::ffff:192.168.192.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [47128676139036]) = 17 <0.000094> fcntl(17, F_SETFL, O_RDWR|O_NONBLOCK) = 0 <0.000035> read(17, "POST / HTTP/1.1rnHost: general.d"..., 8000) = 522 <0.000044> stat("/mnt/hgfs/habari/htdocs/", {st_mode=S_IFDIR|0755, st_size=408, ...}) = 0 <0.000527> open("/mnt/hgfs/habari/htdocs/.htaccess", O_RDONLY) = 18 <0.000457> fcntl(17, F_SETFL, O_RDWR|O_NONBLOCK) = 0 <0.000037>
  • 28. [root@localhost ~]# strace -Tp 4365 Process 6910 attached - interrupt to quit epoll_wait(16, {{EPOLLIN, {u32=31389672, u64=47128707528680}}}, 2, 10000) = 1 <6.926140> accept(4, {sa_family=AF_INET6, sin6_port=htons(64930), inet_pton (AF_INET6, "::ffff:192.168.192.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [47128676139036]) = 17 <0.000094> fcntl(17, F_SETFL, O_RDWR|O_NONBLOCK) = 0 <0.000035> read(17, "POST / HTTP/1.1rnHost: general.d"..., 8000) = 522 <0.000044> stat("/mnt/hgfs/habari/htdocs/", {st_mode=S_IFDIR|0755, st_size=408, ...}) = 0 <0.000527> open("/mnt/hgfs/habari/htdocs/.htaccess", O_RDONLY) = 18 <0.000457>
  • 29. Zend Drupal Log syslog sfLogger Kohana Log error_log("Message for the PHP log") error_log("Log to email", 1, "me@foo.com"); error_log("Log to a file",3, "/tmp/m.log"); error_log("Message for the SAPI log", 4);
  • 30. MQ Syslog File LOGGING SYSTEM Gearman Database Pipe
  • 32. [root@localhost ~]# pear channel-discover pear.firephp.org [root@localhost ~]# pear install firephp/FirePHPCore require_once('FirePHPCore/FirePHP.class.php'); ob_start(); $firephp = FirePHP::getInstance(true); doStuff($firephp); $firephp->warn('Done Stuff'); $firephp->error('An error!'); $firephp->log($_GET); ob_end_flush(); function doStuff($firephp) { $firephp->trace('Stuff Backtrace'); echo "This page intentionally blank"; }
  • 34. <?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="./TestHelper.php" colors="true"> <testsuite name="Commonlib Tests"> <directory>./library/Cl/</directory> <directory>./library/Sso/</directory> </testsuite> <filter> <whitelist> <directory suffix=".php">../Sso/</directory> <directory suffix=".php">../Cl/</directory> </whitelist> </filter> </phpunit>
  • 35. Folder Root CL SSO Auth Client Model User Adapter Plugin Exception Abstract SSO SFDC Gearman
  • 36. <?php $worker = new GearmanWorker(); $worker->addServer(); $worker->addFunction( "allow_access", "allowAccess"); $worker->addFunction( "deny_access", "denyAccess"); while ($worker->work());
  • 37. Git Bisect git bisect start git bisect bad git bisect good <known good rev> git bisect ? git bisect reset
  • 38. good bad 1 Request View 2 Front 3 Controller Plugin Input Model Filter Controller
  • 39. Firewall Cache Web Server Database
  • 40. Tamper Data Curl Firewall Wireshark Cache Netcat Web Server MySQL Proxy Xdebug Database
  • 43.
  • 44. [root@localhost ~]# { echo -ne "HTTP/1.0 200 OKrn rn"; cat test.html; } | nc -l 8080 GET / HTTP/1.1 User-Agent: curl/7.19.7 (i386-apple-darwin10.0.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3 Host: general.dev:8080 Accept: */* [root@localhost ~]# curl http://general.dev:8080 -v * About to connect() to general.dev port 8080 (#0) * Trying 192.168.192.129... connected * Connected to general.dev (192.168.192.129) port 8080 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.19.7 (i386-apple-darwin10.0.0) libcurl/7.19.7 OpenSSL/0.9.8l zlib/1.2.3 > Host: general.dev:8080
  • 45. local log_file = 'mysql.log' local fh = io.open(log_file, "a+") function read_query( packet ) if string.byte(packet) == proxy.COM_QUERY then local query = string.sub(packet, 2) fh:write( string.format("%sn",query)) fh:flush() end end MySQL Proxy
  • 47. [root@localhost ~]#: svn st M index.php [root@localhost ~]#: git stash save Saved working directory and index state WIP on master: 0e22fdd Initial checkin HEAD is now at 0e22fdd Initial checkin [root@localhost ~]#: git status # On branch master nothing to commit (working directory clean) Source Control
  • 48. [root@localhost ~]#: svn log . ------------------------------------------- r4341 | rickc | 2010-09-24 03:01 | 3 lines Don't test if Post::tags is empty before getting tags. There may be a performance hit for this. It can be dealt with if it is noticable. Fixes ticket #1235. Props to ilo for the patch. Note that Post still needs to be updated to use real Tags, not an array of slug/label pairs as the tags member. -------------------------------------------- Source Control
  • 49. Known Good [root@localhost ~]# diff -yw web.conf web2.conf <VirtualHost *:80> <VirtualHost *:80> ServerAdmin root@e.com ServerAdmin root@e.com DocumentRoot /www/htdocs | DocumentRoot /www/hdocs ServerName general.dev ServerName general.dev ErrorLog logs/error_log ErrorLog logs/error_log </VirtualHost> </VirtualHost>
  • 53. [root@localhost htdocs]# history 20 365 ls /mnt/hgfs/habari/ 366 ls 367 vi /etc/httpd/conf.d/web.conf 368 setenforce 0 369 /etc/init.d/httpd restart 370 vi /var/log/httpd/error_log 371 cd /mnt/hgfs/habari/ 372 ls 373 cd htdocs/ 374 ls 375 cd scripts/ 376 ls 377 cd .. 378 ls 379 vi /etc/php.ini
  • 55. Sources of Plugs [root@localhost ~]# apachectl -M Loaded Modules: core_module (static) mpm_prefork_module (static) http_module (static) so_module (static) [root@localhost ~]# whoami auth_basic_module (shared) root auth_digest_module (shared) [root@localhost ~]# ifconfig authn_file_module (shared) eth0 Link encap:Ethernet HWad authn_alias_module (shared) authn_anon_module inet addr:192.168.192.129 (shared) inet6 addr: fe80::20c:29ff: authn_dbm_module (shared)
  • 56. RULE 8 GET A FRESH VIEW
  • 57. if(!is_string($i)) { throw new Xapian_Exception('Incorrect query type, expecting string or array of strings'); } $q = $this->getParser()->parse_query($i);
  • 58. if(!is_string($i)) { throw new Xapian_Exception('Incorrect query type, expecting string or array of strings'); } $q = $this->getParser()->parse_query($i, FLAG_SPELLING_CORRECTION);
  • 59. “Grovelling is not a substitute for doing your homework” - ESR http://www.catb.org/esr/faqs/smart-questions.html
  • 60.
  • 61.
  • 62. RULE 9 IF YOU DIDN’T FIX IT - IT AIN’T FIXED
  • 63. Five Whys The page is blank: Why? There is a fatal error: Why? No mb_check_encoding(): Why? mbstring is not installed: Why? It isn’t part of the build: Why? It was setup for another project.
  • 64. The Rules 1. Understand The System 2. Make It Fail 3. Quit Thinking And Look 4. Divide And Conquer 5. Change One Thing At A Time 6. Keep An Audit Trail 7. Check The Plug 8. Get A Fresh View 9. If You Didn’t Fix It, It Ain’t Fixed
  • 66. Image Credits When men were men and wore white coats - by Jitze http://www.flickr.com/photos/jitze1942/4292084185/ Vacuum Tube Etch-A-Sketch - by Jurvetson http://www.flickr.com/photos/jurvetson/197768962/ Classic - by Oskay http://www.flickr.com/photos/oskay/1364147095 Firmware Bug - by Oskay http://www.flickr.com/photos/oskay/1364148351 Ready to hop - by Oskay http://www.flickr.com/photos/oskay/1364153441/ Albino - by Oskay http://www.flickr.com/photos/oskay/1364143833 Coming Through! - by Oskay http://www.flickr.com/photos/oskay/1364147807 Tux the Pinguin - by Patrick van der Velden From the photographer’s private collection
  • 67. THANKANDTOOLS DEBUGGING: RULES YOU http://joind.in/2173