Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change

Re: The perl debugger and an embedded interpreter

by xiaoyafeng (Chaplain)
on Jun 06, 2012 at 15:42 UTC ( #974754=note: print w/replies, xml ) Need Help??

in reply to The perl debugger and an embedded interpreter

I pass -d to a embedding interpreter, and it works fine (on windows).

So maybe posting your code would help.

And please note in debug mode, perl will load some XS modules background, so you should comply a xs_init file with your code.

I am trying to improve my English skills, if you see a mistake please feel free to reply or /msg me a correction

  • Comment on Re: The perl debugger and an embedded interpreter

Replies are listed 'Best First'.
Re^2: The perl debugger and an embedded interpreter
by aufflick (Deacon) on Jun 07, 2012 at 04:34 UTC
    Pasting the code in helped me realise the problem - no perl_run()! It's not strictly required normally since I run code via call_perl() etc. but since the perl debugger is simple code in that gets executed at require time, it was never actually getting executed.

    The welcome message threw me off - I guess that must get printed in a BEGIN {} block.

Re^2: The perl debugger and an embedded interpreter
by aufflick (Deacon) on Jun 07, 2012 at 03:02 UTC
    Yes I have an xs_init (that I know works, because I can load XS modules). Here is my relevant embedding code:

    static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ int argc = 1; char * argv[] = { "myPerlInterp", "-w" }; PERL_SYS_INIT3(&argc, (char ***)&argv, (char ***)NULL); }); ... [(NSMutableDictionary *)envDict setObject:@"TTY=/dev/ttys001 L +ineInfo=/dev/ttys003 ReadLine=1" forKey:@"PERLDB_OPTS"]; my_perl_env = calloc(sizeof(char *), [envDict count] + 1); int i=0; for (NSString * var in [envDict allKeys]) { //TODO: unsure if this is going to propogate any non-ascii + paths correctly NSString * entry = [NSString stringWithFormat:@"%@=%@", va +r, [envDict objectForKey:var]]; const char * val = [entry UTF8String]; char * val_copy = calloc(sizeof(char), strlen(val) + 1); strncpy(val_copy, val, strlen(val)); my_perl_env[i++] = val_copy; } my_perl_queue = dispatch_queue_create([label cStringUsingEncod +ing:NSASCIIStringEncoding], DISPATCH_QUEUE_SERIAL); dispatch_sync(my_perl_queue, ^{ //char * embedding[] = { "", "-w", "-e", "0" }; char * embedding[] = { "", "-w", "-d", "-e", "0" }; int embedding_count = sizeof(embedding) / sizeof(char *); my_perl = perl_alloc(); PL_perl_destruct_level = 1; perl_construct(my_perl); perl_parse(my_perl, xs_init, embedding_count, embedding, m +y_perl_env); // not sure why the perl_parse env isn't used to setup @IN +C - even giving it to PERL_SYS_INIT3 doesn't work eval_pv("use Env qw(@PERL5LIB); push @INC, @PERL5LIB;", TR +UE); PL_exit_flags |= PERL_EXIT_DESTRUCT_END; }); }
    If you're not familiar with blocks and grand central dispatch, just imagine the code in the ^{ ... } bits are running on a background thread. The envDict is an NSDictionary containing how I want the environment to be setup.

    As I said this generally works, and in the above incantation, /dev/ttys01 gets this output:

    Marks-MacBook-Air:~ aufflick$ sleep 1000000 Loading DB routines from version 1.32 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help.
    And then the code continues to run with no interactive prompt (just typing stuff leaves it in the buffer - stdin never seems to be read). The same happens just running at the console without the PERL5DB_OPTS or using the RemotePort/nc method.

    I'm trying to figure out how to set a breakpoint in advance to see if that manages to enter the debugger. perldebguts talks about %{"::_<current_file"} but I can't seem to figure it out.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://974754]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (2)
As of 2018-05-20 14:34 GMT
Find Nodes?
    Voting Booth?