Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re: Weird STDERR/SIGDIE/Encodings issue

by McA (Curate)
on Mar 28, 2013 at 22:54 UTC ( #1026051=note: print w/ replies, xml ) Need Help??


in reply to Weird STDERR/SIGDIE/Encodings issue

In sub dsc try the following:

print STDERR decode('UTF-8', $filename);

As far as I can see you get an encoding error in dsc which is called in a die handler and I'm pretty sure this causes a recursion.

McA


Comment on Re: Weird STDERR/SIGDIE/Encodings issue
Select or Download Code
Re^2: Weird STDERR/SIGDIE/Encodings issue
by vsespb (Hermit) on Mar 28, 2013 at 23:10 UTC

    Almost any change to that code fixes it. Yes, including decode.

    I more interesting in finding root of problem, as user have crashes in a bit different circumstances.

    Also in my program I will be unable to just "decode" things, as it prints stacktrace, including function argument and sometimes I have binary data (not character string) or even filenames in binary format (not UTF-8, because FreeBSD filesystem sometimes use non-UTF-8 filenames)

    I think die inside die handler cannot cause a recursion:

    http://perldoc.perl.org/perlvar.html#%25SIG

     The __DIE__ handler is explicitly disabled during the call, so that you can die from a __DIE__ handler

    also such recursion would produce stackoverflow fast.

    Currently it looks to me that it's just a bug in Encode XS code, and I can workaround it by _escaping_ any non-ASCII octets (both binary data and wide characters)

      Concerning the recursion I speculated about the following: You're right that the sig handler is disabled, but the standard die functionality is done anyway. So the error string is printed via STDERR on which you enabled the encoding IO layer with binmode. The following code reproduces the error:

      #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Encode; $SIG{__DIE__} = sub { if (defined $^S && $^S == 0) { for my $s (0..$#_) { dcs($_[$s]); }; } }; sub dcs { print Dumper(\@_); my ($p1, $p2) = @_; my @caller = caller(0); print Dumper(\@caller); print STDERR $caller[1]; print STDERR "me: " . $p1; } sub mysub { die; } binmode STDERR, ":encoding(koi8-r)"; binmode STDOUT, ":encoding(koi8-r)"; mysub();

      As soon as you change the line

      print STDERR $caller[1];
      by
      print STDOUT $caller[1];
      you don't get the hanging behaviour.

      UPDATE: If you keep the first version but you insert the follwoing line in the if-clause of your die-handler

      binmode STDERR, ':raw';
      you also don't get the hanging behaviour even when printing at STDERR.

      McA

        OK. Seems you are right! Thanks! BTW I tried to reproduce it on FreeBSD system with non-Unicode locale (i.e. console, locale and filenames are in KOI8-R). But seems it works fine (perl 12) and escapes characters (while escape are wrong):
        "\x{00d5}" does not map to koi8-r at \x{0552}\x{006f}33.pl line 18. "\x{00d2}" does not map to koi8-r at \x{0552}\x{006f}33.pl line 18. "\x{00c1}" does not map to koi8-r at \x{0552}\x{006f}33.pl line 18. ... Died at \x{0552}\x{006f}33.pl line 28.
        While linux (perl 10 and perl 14) does not try to escape (probably detects UTF8 locale)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1026051]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (5)
As of 2014-09-20 11:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (158 votes), past polls