Author image Matthew Horsfall (alh)
and 1 contributors


Devel::GDB::Parser::Breakpoint - Create easily identifiable gdb breakpoints in Perl parser code.


In some Perl program (

  use strict;
  use warnings;
  use Devel::GDB::Parser::Breakpoint;
  print "before\n";
  # Call bp(42) during parsing of this line
  parser_breakpoint 42;
  print "after\n";


  $ gdb --args perl ./

  (gdb) b bp if val == 42
  Function "bp" not defined.
  Make breakpoint pending on future shared library load? (y or [n]) y
  Breakpoint 1 (bp if val == 42) pending.
  (gdb) run
  Starting program: /usr/bin/perl
  [Thread debugging using libthread_db enabled]

  Breakpoint 1, bp (val=42) at Breakpoint.xs:7
  7       void bp(int val) {}


This module allows you to inject breakpoints into the parsing of your Perl code by the perl binary that you can easily identify with gdb.

It exports the parser_breakpoint sub at runtime which can be called from any Perl code with an integer value as its argument. When the perl lexer/parser reaches the line, the module calls a C function called bp with the argument you gave as its only parameter, which is named val.

IE, in Perl:

  parser_breakpoint 3;

Equates to:

  void bp(int val) {};


Which allows you in gdb to set breakpoints like so:

  (gdb) b bp if val == 3

Note that parser_breakpoint always returns the value 1. It can be used in complex statements/expressions to see what's going on:

  if ($x && $y && parser_breakpoint 2 && $z) { ... }

And since it happens at lexer/parser time, it will still execute here:

  if (0 && parser_breakpoint 3) { ... }


I'm really not sure you would.

But it may be useful if you want to easily see what the perl lexer/parser is doing as it reads different parts of your source.

Alternatively, in Perl you can:

  BEGIN { study; }

And in gdb:

  (gdb) b Perl_pp_study

However, this doesn't allow you to break inside of if blocks like in the examples above.


This module requires at least Perl 5.11.2 because of pluggable keywords. See "PL_keyword_plugin" in perlapi for more information.


Devel::GDB::Breakpoint - Create easily identifiable runtime gdb breakpoints in Perl code


Matthew Horsfall (alh) - <>


Copyright (C) 2013 by Matthew Horsfall

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.1 or, at your option, any later version of Perl 5 you may have available.