NAME

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

SYNOPSIS

In some Perl program (prog.pl):

#!/usr/bin/perl

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";

Then:

$ gdb --args perl ./prog.pl
...

(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 prog.pl
[Thread debugging using libthread_db enabled]

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

DESCRIPTION

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) {};

bp(3);

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) { ... }

WHY WOULD I WANT THIS?

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.

SEE ALSO

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

AUTHOR

Matthew Horsfall (alh) - <wolfsage@gmail.com>

COPYRIGHT AND LICENSE

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.