LOGO

____              _   _
|  _ \ _   _ _ __ | |_(_)_ __ ___   ___
| |_) | | | | '_ \| __| | '_ ` _ \ / _ \
|  _ <| |_| | | | | |_| | | | | | |  __/
|_| \_\\__,_|_| |_|\__|_|_| |_| |_|\___|

____       _
|  _ \  ___| |__  _   _  __ _  __ _  ___ _ __
| | | |/ _ \ '_ \| | | |/ _` |/ _` |/ _ \ '__|
| |_| |  __/ |_) | |_| | (_| | (_| |  __/ |
|____/ \___|_.__/ \__,_|\__, |\__, |\___|_|
                       |___/ |___/

NAME

Runtime::Debugger - Easy to use REPL with existing lexicals support.

SYNOPSIS

tl;dr - Easy to use REPL with existing lexicals support.

(empahsis on "existing" since I have not yet found this support in others modules).

Try with this command line:

perl -MRuntime::Debugger -E 'my $str1 = "Func"; our $str2 = "Func2"; my @arr1 = "arr-1"; our @arr2 = "arr-2"; my %hash1 = qw(hash 1); our %hash2 = qw(hash 2); my $coderef = sub { "code-ref: @_" }; {package My; sub Func{"My-Func"} sub Func2{"My-Func2"}} my $obj = bless {}, "My"; eval run; say $@'

DESCRIPTION

One can usually just do this:

# Insert this where you want to pause:
$DB::single = 1;

# Then run the perl debugger to navigate there quickly:
PERLDBOPT='Nonstop' perl -d my_script

If that works for then great and dont' bother using this module!

Unfortunately for me, it was not working due to the scenario in which a script evals another perl test file and I would have liked to pause inside the test and see whats going on without having to keep rerunning the whole test over and over.

This module basically drops in a read,evaludate,print loop (REPL) whereever you need like so:

use Runtime::Debugger;
eval run;                # Not sure how to avoid using eval here while
                         # also being able to keep the lexical scope.
                         # Any ideas ? :)

Press tab to autocomplete any lexical variables in scope (where "eval run" is found).

Saves history locally.

Can use 'p' to pretty print a variable or structure.

New Variables

Currently its not possible to create any new lexicals variables while I have not yet found a way to run "eval" with a higher scope of lexicals. (perhaps there is another way?)

You can make global variables though if:

- By default ($var=123) - Using our (our $var=123) - Given the full path ($My::var = 123)

SUBROUTINES/METHODS

run

Runs the REPL (dont forget eval!)

eval run

Sets $@ to the exit reason like 'INT' (Control-C) or 'q' (Normal exit/quit).

_match

Returns the possible matches:

Input: words => ["cat", "cake", "bat", "bake"], partial => "c", # Default: "" - What you typed so far. prepend => "Class>", # Default: "" - prepend to each possiblity. nospace => 0, # Default: "0" - will not append a space after a completion.

help

Show help section.

hist

Show history of commands.

By default will show 20 commands:

hist

Same thing:

hist 20

Can show more:

hist 50

p

Data::Dumper::Dump anything.

p 123
p [1, 2, 3]

Can adjust the maxdepth (default is 1) to see with: "#Number".

p { a => [1, 2, 3] } #1

Output:

{
  'a' => 'ARRAY(0x55fd914a3d80)'
}

Set maxdepth to '0' to show all nested structures.

uniq

Return a list of uniq values.

attr

Internal use.

debug

Internal use.

term

Internal use.

ENVIRONMENT

Install required library:

sudo apt install libreadline-dev

Enable this environmental variable to show debugging information:

RUNTIME_DEBUGGER_DEBUG=1

SEE ALSO

https://metacpan.org/pod/Devel::REPL

Great extendable module!

Unfortunately, I did not find a way to get the lexical variables in a scope. (maybe missed a plugin?!)

https://metacpan.org/pod/Reply

This module also looked nice, but same issue.

AUTHOR

Tim Potapov, <tim.potapov[AT]gmail.com> 🐪🥷

BUGS

- no new lexicals

Please report any (other) bugs or feature requests to https://github.com/poti1/runtime-debugger/issues.

SUPPORT

You can find documentation for this module with the perldoc command.

perldoc Runtime::Debugger

You can also look for information at:

https://metacpan.org/Runtime::Debugger https://github.com/poti1/runtime-debugger

LICENSE AND COPYRIGHT

This software is Copyright (c) 2022 by Tim Potapov.

This is free software, licensed under:

The Artistic License 2.0 (GPL Compatible)