---
name: "Perlbal::Manual::Debugging"
section: "3pm"
platform: "linux"
package: "libperlbal-perl"
version: "1.80-4"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Perlbal::Manual::Debugging"
---

# Perlbal::Manual::Debugging(3pm)

Debugging Perlbal

## NAME

Perlbal::Manual::Debugging - Debugging Perlbal

### VERSION

Perlbal 1.78.

### DESCRIPTION

Perlbal has two ways of debugging.

One of them is through a management console; the other is through debugging messages.

### Debugging in a console

You'll need to set up a management service and use it to dump all the information you require.

The comprehensive documentation on this process can be found at Perlbal::Manual::Management.

### Debugging messages

You can control the ammount of debugging messages Perlbal dumps by setting the environment variable `"PERLBAL_DEBUG"` to a value between 0 and 4:

```
    PERLBAL_DEBUG = 0 # no debug
    PERLBAL_DEBUG = 4 # debug everything
```

*Debug level 1*

You can activate basic debug by setting `"PERLBAL_DEBUG"` to 1:

```
    PERLBAL_DEBUG = 1
```

The following debugging messages are turned on:

- •

  When a connection to a backend is closed, Perlbal::BackendHTTP prints `"Backend $self is done; closing..."`

- •

  When a connection to a backend is killed, Perlbal::ClientProxy prints `"Client ($self) closing backend ($backend)"`

- •

  When an HTTP request fails to be parsed, Perlbal::HTTPHeaders prints `"HTTP parse failure: $reason"`

- •

  When the connection is promoted to SSL, Perlbal::TCPListener prints `"  .. socket upgraded to SSL!"`

*Debug level 2*

By setting the debug level to 2 you'll get all the messages from level 1.

```
    PERLBAL_DEBUG = 2
```

You will also get a few others:

- •

  When a connection to a backend is opened and ready to be written to, Perlbal::BackendHTTP prints `"Backend $self is writeable!"`

- •

  When a response is about to be handled, Perlbal::BackendHTTP prints `"BackendHTTP: handle_response"`

- •

  When a backend is ready to be read from, Perlbal::BackendHTTP prints `"Backend $self is readable!"`

- •

  When there's an error with the connection to the backend, Perlbal::BackendHTTP prints `"BACKEND event_err"`

- •

  Whenever we're determining if we should be sending keep-alive header information back to the client, Perlbal::ClientHTTPBase prints `"ClientHTTPBase::setup_keepalive($self)"`

- •

  Whenever the client is ready for more of its file, Perlbal::ClientHTTPBase prints `"REPROXY SSL done"`

- •

  Right after we've read a chunk of a file and when a reproxy request is about to be sent, Perlbal::ClientHTTPBase prints `"REPROXY Sent: $sent"`

- •

  When we've written all data in the queue (and are about to stop waiting for write notifications), Perlbal::ClientHTTPBase prints `"All writing done to $self"`

- •

  Whenever a client proxy is about to be closed, Perlbal::ClientProxy prints `"Perlbal::ClientProxy closed"`, followed by a possible `"again"` and a possible `"saying $reason"`

- •

  When a client has disconnected, Perlbal::ClientProxy prints `"ClientProxy::client_disconnected"`

- •

  When a backend requests a client of a high priority request and the client is available, "Service" in Perlbal prints `"Got from fast queue, in front of $backlog others"`

- •

  When a backend requests a client of a normal priority request and the client is available, "Service" in Perlbal prints `"Backend requesting client, got PRIORITY = $cp-"`{fd}.\>

- •

  When a backend requests a client of a low priority request and the client is available, "Service" in Perlbal prints `"Backend requesting client, got low priority = $cp-"`{fd}.\>

- •

  When header are being read, Perlbal::Socket prints `"Perlbal::Socket::read_headers($self) is_res=$is_res"`

*Debug level 3*

```
    PERLBAL_DEBUG = 3
```

By setting the debug level to 3 you'll get all the messages from level 1 and 2 plus the following:

- •

  Right before response headers are written to the client, Perlbal::BackendHTTP prints `"  writing response headers to client"`

- •

  As we're writing to the client, Perlbal::BackendHTTP prints `"  content_length=VALUE"` and `"  remain=VALUE"`, where the values are `"undef"` if they are not defined

- •

  If we're done writing to the client, Perlbal::BackendHTTP prints `"  done.  detaching."`

- •

  Whenever we're determining if we should be sending keep-alive header information back to the client, Perlbal::ClientHTTPBase prints `"  service's persist_client = $persist_client"`

- •

  While determining if we should be sending keep-alive header information back to the client, if we were sent `"content-length"` or it's a head request, as we're doing a keep alive Perlbal::ClientHTTPBase prints `"  doing keep-alive to client"`

- •

  If we're not sending keep-alive header information back ot the client, Perlbal::ClientHTTPBase prints `"  doing connection: close"`

- •

  Right after we've finished sending all of the results to the user, Perlbal::ClientProxy prints `"ClientProxy::backend_finished"`

- •

  When we've sent a response to a user fully and we need to reset state, Perlbal::ClientProxy prints `"ClientProxy::http_response_sent -- resetting state"`

- •

  When we're writing a response to a client, Perlbal::ClientProxy prints `"ClientProxy::event_write"`

- •

  After writing a response to a client, if it is still connected and we're triggering trigger our backend to keep reading, Perlbal::ClientProxy prints `"  unstalling backend"`

- •

  When reading a request, Perlbal::ClientProxy prints `"ClientProxy::event_read"`

- •

  When reading a request and just before we read the headers, Perlbal::ClientProxy prints `"  no headers.  reading."`

- •

  When reading a request, if we're not buffering to disk or we're no longer reading, as we disable reads, Perlbal::ClientProxy prints `"  disabling reads."`

- •

  As we're reading, Perlbal::ClientProxy prints `"  reading $read_size bytes (VALUE bytes remain)"`, where `"VALUE bytes remain"` can be \<undef\>

- •

  After each read, Perlbal::ClientProxy prints `"  read $len bytes"`

- •

  After we finished reading the request, Perlbal::ClientProxy prints `"  done_reading = $done_reading, backend = BACKEND"`, where `"BACKEND"` can be `"undef"`

- •

  When we send the headers to the backend and it responds before we're done reading from the client, further reads from the client are discarded; in this situation Perlbal::ClientProxy prints `"  already responded."`. If the client continues to send data, Perlbal::ClientProxy prints `"  already responded [2]."` and then gives up on reading

- •

  After reading, and having a backend available where we can write to, just before we do, Perlbal::ClientProxy prints `"  got a backend.  sending write to it."`

- •

  After reading, if there's no backend available, Perlbal::ClientProxy prints `"  no backend.  read_ahead = $self-"`{read\_ahead}.\>

- •

  If we know we've already started spooling a file to disk and we're about to continue doing so, Perlbal::ClientProxy prints `"  bureason = $self-"`{bureason}\>

- •

  If a backend wasn't available and we're about to request one, Perlbal::ClientProxy prints `"  finally requesting a backend"`

- •

  When we're trying to read headers and the client has disconnected, Perlbal::Socket prints `"  client disconnected"`

- •

  If we need to remove a trailing `"\r\n"` from the headers, Perlbal::Socket prints `"  throwing away leading \r\n"`

- •

  If we've read a packet with headers and by the end of it we can't find the end of them, Perlbal::Socket prints `"  can't find end of headers"`

- •

  Once we've read some headers, Perlbal::Socket prints `"  pre-parsed headers: [$hstr]"`

- •

  After reading headers, if there's additional content that we've read, we push it back; when we do so, Perlbal::Socket prints `"  pushing back $len bytes after header"`

- •

  If we got bogus headers, and right before we close the connection due to a parsing failure, Perlbal::Socket prints `"  bogus headers"`

- •

  If we got valid headers, Perlbal::Socket prints `"  got valid headers"`

- •

  If we're reading buffered data from a client, Perlbal::Socket prints `"draining readbuf from $self to $dest: [$$bref]"`

*Debug level 4*

By setting the debug level to 4 you get all the messages from levels 1 to 3.

Plus, `"write"` is redefined so that whenever `"write"` is called it first prints `"write($self, <$clen>"$content") from ($pkg, $filename, $line)"`.

```
    PERLBAL_DEBUG = 4
```

### SEE ALSO

Perlbal::Manual::Configuration, Perlbal::Manual::Management.
