perlancar has asked for the wisdom of the Perl Monks concerning the following question:

Just want to check with everybody, is it just me or are Signal::StackTrace and its fork Signal::StackTrace::CarpLike not working properly? At least on Linux (I'm using 5.18.1).

#!perl use Signal::StackTrace qw(INT); sub f { g() } sub g { sleep 10 } f;
If I press Ctrl-C in the middle of run, the program above should print a stack trace with f, g included in the trace levels. Which will happen if I replace "sleep" with "die". Instead, what I'm getting is just:
Caller level 0:
{
  Bitmask => 'UUUUUUUUUUUUUU',
  Evaltext => undef,
  Filename => '/path/to/script',
  Hasargs => 1,
  Hints => 0,
  'Line-No' => 0,
  Package => 'main',
  Require => undef,
  Subroutine => 'Signal::StackTrace::__ANON__',
  Wantarray => ''
}
Caller level 1:
{
  Bitmask => 'UUUUUUUUUUUUUU',
  Evaltext => undef,
  Filename => '/path/to/script',
  Hasargs => 0,
  Hints => 2018,
  'Line-No' => 0,
  Package => 'main',
  Require => undef,
  Subroutine => '(eval)',
  Wantarray => ''
}

Replies are listed 'Best First'.
Re: Signal::StackTrace not working?
by Athanasius (Archbishop) on Oct 12, 2014 at 03:13 UTC

    Hello perlancar,

    I’m seeing the same behaviour on Windows. I think the problem is that the trace is given from the vantage point of the statement immediately following the statement that was in effect when the signal was received. I played around with the following script:

    #!perl use strict; use warnings; use Signal::StackTrace::CarpLike qw( INT ); f(); print "After f()\n"; sub f { g(); } sub g { sleep 5; print "In g(), after sleep\n"; }

    Output:

    13:05 >perl 1052_SoPW.pl INT at 1052_SoPW.pl line 13. eval {...} called at 1052_SoPW.pl line 13 main::g() called at 1052_SoPW.pl line 9 main::f() called at 1052_SoPW.pl line 6 In g(), after sleep After f() 13:05 >

    Note the line number: line 13 is the print statement following sleep. And with that print statement commented out:

    13:05 >perl 1052_SoPW.pl INT at 1052_SoPW.pl line 7. eval {...} called at 1052_SoPW.pl line 7 After f() 13:07 >

    The INT signal is now reported as having been received after sub g returned, because sleep happened to be the last statement in the sub. And the stack trace shown is correct as from the viewpoint of line 7.

    This looks like a fairly serious bug to me.

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,