use strict; use warnings; use threads; use Carp qw(cluck); $Carp::Verbose = 1; use Inline 'C'; $SIG{__DIE__} = sub { cluck('someone died: ' . $_[0]); }; sub sub_that_dies { cluck('starting sub_that_dies'); sleep(2); die "something bad happened"; } sub start_thread { my ($arg) = @_; cluck('starting start_thread'); print "thread started: $arg\n"; if($arg == 1) { sub_that_dies(); } else { sub_that_core_dumps(); } } my $thr1 = threads->create('start_thread', 1); $thr1->join(); my $thr2 = threads->create('start_thread', 2); $thr2->join(); __END__ __C__ #include void sub_that_core_dumps() { printf("starting sub_that_core_dumps\n"); sleep(2); printf("sub_that_core_dumps awoke\n"); Inline_Stack_Vars; Inline_Stack_Push(newSVpvf("About to segfault in sub_that_core_dumps")); Inline_Stack_Done; perl_call_pv("Carp::cluck",0); memcpy(0,"source",1); Inline_Stack_Void; } #### starting start_thread at ./test2.pl line 20 thread 1 main::start_thread(1) called at ./test2.pl line 30 thread 1 eval {...} called at ./test2.pl line 30 thread 1 thread started: 1 starting sub_that_dies at ./test2.pl line 12 thread 1 main::sub_that_dies() called at ./test2.pl line 22 thread 1 main::start_thread(1) called at ./test2.pl line 30 thread 1 eval {...} called at ./test2.pl line 30 thread 1 someone died: something bad happened at ./test2.pl line 14. at ./test2.pl line 9 thread 1 main::__ANON__('something bad happened at ./test2.pl line 14.\x{a}') called at ./test2.pl line 14 thread 1 main::sub_that_dies() called at ./test2.pl line 22 thread 1 main::start_thread(1) called at ./test2.pl line 30 thread 1 eval {...} called at ./test2.pl line 30 thread 1 Thread 1 terminated abnormally: something bad happened at ./test2.pl line 14. starting start_thread at ./test2.pl line 20 thread 2 main::start_thread(2) called at ./test2.pl line 33 thread 2 eval {...} called at ./test2.pl line 33 thread 2 thread started: 2 starting sub_that_core_dumps sub_that_core_dumps awoke About to segfault in sub_that_core_dumps at ./test2.pl line 25 thread 2 main::start_thread(2) called at ./test2.pl line 33 thread 2 eval {...} called at ./test2.pl line 33 thread 2 Segmentation fault (core dumped) #### #0 sub_that_core_dumps () at test2_pl_945a.xs:15 #1 0xb7745ad2 in XS_main_sub_that_core_dumps (my_perl=0x93ec518, cv=0x947f61c) at test2_pl_945a.xs:30 #2 0x08137c50 in Perl_pp_entersub (my_perl=0x93ec518) at pp_hot.c:2952 #3 0x081019e9 in Perl_runops_debug (my_perl=0x93ec518) at dump.c:2120 #4 0x08082d5b in Perl_call_sv (my_perl=0x93ec518, sv=0x94f19c4, flags=10) at perl.c:2611 #5 0xb7416224 in S_ithread_run (arg=0x93a97e8) at threads.xs:509 #6 0xb76b84c0 in start_thread () from /lib/i686/cmov/libpthread.so.0 #7 0xb763784e in clone () from /lib/i686/cmov/libc.so.6