httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From field...@hyperreal.org
Subject cvs commit: apache-devsite debugging.html
Date Fri, 09 Oct 1998 19:35:52 GMT
fielding    98/10/09 12:35:52

  Modified:    .        debugging.html
  Log:
  Describe how to use gdb so that we can point to this file when
  users ask questions or report problems.
  
  Revision  Changes    Path
  1.2       +135 -2    apache-devsite/debugging.html
  
  Index: debugging.html
  ===================================================================
  RCS file: /export/home/cvs/apache-devsite/debugging.html,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- debugging.html	1998/04/20 05:50:13	1.1
  +++ debugging.html	1998/10/09 19:35:51	1.2
  @@ -1,6 +1,16 @@
  -<HTML><HEAD>
  +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
  +<HTML>
  +<HEAD>
   <TITLE>Apache Debugging Guide</TITLE>
  -</HEAD><BODY>
  +</HEAD>
  +<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
  +<BODY
  +BGCOLOR="#FFFFFF"
  +TEXT="#000000"
  +LINK="#0000FF"
  +VLINK="#000080"
  +ALINK="#FF0000"
  +>
   
   <H1>Apache Debugging Guide</H1>
   
  @@ -16,10 +26,133 @@
   
   <P><A NAME="gdb"><B>Using '<CODE>gdb</CODE>'</B></A>
   
  +<P>If you use the gcc or egcs compilers, it is likely that the best
  +debugger for your system is gdb.  This is only a brief summary of how
  +to run gdb on Apache -- you should look at the info and man files for
  +gdb to get more information on gdb commands and common debugging techniques.
  +Before running gdb, be sure that the server is compiled with the
  +<CODE>-g</CODE> option in <CODE>EXTRA_CFLAGS</CODE> to include
the
  +symbol information in the object files.
  +
  +<P>The only tricky part of running gdb on Apache is forcing the server
  +into a single-process mode so that the parent process being debugged 
  +does the request-handling work instead of forking child processes.
  +We have provided the <CODE>-X</CODE> option for that purpose.
  +
  +<P>The following example, with <font color=green>user input in green</font>,
  +shows the output of gdb run on a server executable (httpd) in the current
  +working directory and using the server root of <CODE>/usr/local/apache</CODE>:
  +<PRE>
  +    % <font color=green>gdb httpd</font>
  +    GDB is free software and you are welcome to distribute copies of it
  +     under certain conditions; type "show copying" to see the conditions.
  +    There is absolutely no warranty for GDB; type "show warranty" for details.
  +    GDB 4.16.gnat.1.13 (sparc-sun-solaris2.5), 
  +    Copyright 1996 Free Software Foundation, Inc...
  +    (gdb) <font color=green>b ap_process_request</font>
  +    Breakpoint 1 at 0x49fb4: file http_request.c, line 1164.
  +    (gdb) <font color=green>run -X -d /usr/local/apache</font>
  +    Starting program: /usr/local/apache/src/httpd -X -d /usr/local/apache
  +    
  +    [at this point I make a request from another window]
  +
  +    Breakpoint 1, ap_process_request (r=0x95250) at http_request.c:1164
  +    1164        if (ap_extended_status)
  +    (gdb) <font color=green>s</font>
  +    1165            ap_time_process_request(r-&gt;connection-&gt;child_num, START_PREQUEST);
  +    (gdb) <font color=green>n</font>
  +    1167        process_request_internal(r);
  +    (gdb) <font color=green>s</font>
  +    process_request_internal (r=0x95250) at http_request.c:1028
  +    1028        if (!r-&gt;proxyreq &amp;&amp; r-&gt;parsed_uri.path) {
  +    (gdb) <font color=green>s</font>
  +    1029            access_status = ap_unescape_url(r-&gt;parsed_uri.path);
  +    (gdb) <font color=green>n</font>
  +    1030            if (access_status) {
  +    (gdb) <font color=green>s</font>
  +    1036        ap_getparents(r-&gt;uri);     /* OK --- shrinking transformations...
*/
  +    (gdb) <font color=green>n</font>
  +    1038        if ((access_status = location_walk(r))) {
  +    (gdb) <font color=green>n</font>
  +    1043        if ((access_status = ap_translate_name(r))) {
  +    (gdb) <font color=green>n</font>
  +    1048        if (!r-&gt;proxyreq) {
  +    (gdb) <font color=green>n</font>
  +    1053            if (r-&gt;method_number == M_TRACE) {
  +    (gdb) <font color=green>n</font>
  +    1062        if (r-&gt;proto_num &gt; HTTP_VERSION(1,0) &amp;&amp; ap_table_get(r-&gt;subprocess_env,
"downgrade-1.0")) {
  +    (gdb) <font color=green>n</font>
  +    1071        if ((access_status = directory_walk(r))) {
  +    (gdb) <font color=green>s</font>
  +    directory_walk (r=0x95250) at http_request.c:288
  +    288         core_server_config *sconf = ap_get_module_config(r-&gt;server-&gt;module_config,
  +    (gdb) <font color=green>b ap_send_error_response</font>
  +    Breakpoint 2 at 0x47dcc: file http_protocol.c, line 2090.
  +    (gdb) <font color=green>c</font>
  +    Continuing.
  +    
  +    Breakpoint 2, ap_send_error_response (r=0x95250, recursive_error=0)
  +        at http_protocol.c:2090
  +    2090        BUFF *fd = r-&gt;connection-&gt;client;
  +    (gdb) <font color=green>where</font>
  +    #0  ap_send_error_response (r=0x95250, recursive_error=0)
  +        at http_protocol.c:2090
  +    #1  0x49b10 in ap_die (type=403, r=0x95250) at http_request.c:989
  +    #2  0x49b60 in decl_die (status=403, phase=0x62db8 "check access", r=0x95250)
  +        at http_request.c:1000
  +    #3  0x49f68 in process_request_internal (r=0x95250) at http_request.c:1141
  +    #4  0x49fe0 in ap_process_request (r=0x95250) at http_request.c:1167
  +    #5  0x439d8 in child_main (child_num_arg=550608) at http_main.c:3826
  +    #6  0x43b5c in make_child (s=0x7c3e8, slot=0, now=907958743)
  +        at http_main.c:3898
  +    #7  0x43ca8 in startup_children (number_to_start=6) at http_main.c:3972
  +    #8  0x44260 in standalone_main (argc=392552, argv=0x75800) at http_main.c:4250
  +    #9  0x449fc in main (argc=4, argv=0xefffee8c) at http_main.c:4534
  +    (gdb) <font color=green>s</font>
  +    2091        int status = r-&gt;status;
  +    (gdb) <font color=green>p status</font>
  +    $1 = 403
  +    (gdb) 
  +</PRE>
  +
  +<P>There are a few things to note about the above example:
  +<OL>
  +<LI>the "<CODE>gdb httpd</CODE>" command does not include any command-line
  +    options for httpd: those are provided when the "<CODE>run</CODE>" command
  +    is done within gdb;
  +<LI>I set a breakpoint before starting the run so that execution would stop
  +    at the top of ap_process_request();
  +<LI>the "<CODE>s</CODE>" command steps through the code and into called
  +    procedures, whereas the "<CODE>n</CODE>" (next) command steps through
  +    the code but not into called procedures.
  +<LI>additional breakpoints can be set with the "<CODE>b</CODE>" command,
  +    and the run continued with the "<CODE>c</CODE>" command.
  +<LI>use the "<CODE>where</CODE>" command (a.k.a. "<CODE>bt</CODE>")
to see
  +    a stack backtrace that shows the order of called procedures and their
  +    parameter values.
  +<LI>use the "<CODE>p</CODE>" command to print the value of a variable.
  +</OL>
  +
   <P>A file in the <CODE>src/</CODE> directory, <CODE>.gdbinit</CODE>,
   provides a useful macro for printing out the contents of a table
   structure, called <CODE>dump_table</CODE>.
   
  +<P>If you are debugging a repeatable crash, simply run gdb as above
  +and make the request -- gdb should capture the crash and provide a
  +prompt where it occurs.
  +
  +<P>If you are debugging an apparent infinite loop, simply run gdb as above
  +and type a Control-C -- gdb will interrupt the process and provide a
  +prompt where it was stopped.
  +
  +<P>If you are debugging a system crash and you have a core file from
  +the crash, then do the following:
  +<PRE>
  +    % gdb httpd -c core
  +    (gdb) where
  +</PRE>
  +and it will (hopefully) print a stack backtrace of where the core dump
  +occurred during processing.
   <P>
   
   <HR>
  
  
  

Mime
View raw message