in reply to Re^4: Event module and threads/fork segfault on Win32
in thread Event module and threads/fork segfault on Win32
It would appear to be 5.8.8 that is the deciding factor as to whether it segfaults or not. Having installed the latest versions threads:v1.62 and Event:v1.09; I get no trap from your code under 5.8.6(AS811), but I do under 5.8.8(AS817).
However, if I do not nest the threads stuff inside the Event callback, no trap occurs either. HTH.
Update: I finally got the segfault to occur under the auspices of a debugger.
The trap is occurring in ev.c:187, when the if statement attempts to access WvACTIVE(wa). That doesn't explain why it happens, but it might give somebody a starting point.
Disassembly of Function Event.dll!pe_event_postCB (0x00363D57) ;******************************************************************* +************* SYM:pe_event_postCB <Void> ; ev.c - Line 183 ; static void pe_event_postCB(pe_cbframe *fp) { 0x363D57: PUSH EBP 0x363D58: MOV EBP,ESP 0x363D5A: SUB ESP,0xC ; ev.c - Line 184 ; pe_event *ev = fp->ev; 0x363D5D: MOV EAX,DWORD PTR [EBP+0x8] ; ARG:fp <pe +_cbframe *> 0x363D60: MOV EAX,DWORD PTR [EAX] 0x363D62: MOV DWORD PTR [EBP-0x4],EAX ; VAR:ev <pe +_event *> ; ev.c - Line 185 ; pe_watcher *wa = ev->up; 0x363D65: MOV EAX,DWORD PTR [EBP-0x4] ; VAR:ev <pe +_event *> 0x363D68: MOV EAX,DWORD PTR [EAX+0x8] 0x363D6B: MOV DWORD PTR [EBP-0x8],EAX ; VAR:wa <pe +_watcher *> ; ev.c - Line 186 ; --CurCBFrame; 0x363D6E: MOV EAX,DWORD PTR [0x10012020] 0x363D73: DEC EAX 0x363D74: MOV DWORD PTR [0x10012020],EAX ; ev.c - Line 187 ; if (WaACTIVE(wa) && WaINVOKE1(wa) && WaREPEAT(wa)) 0x363D79: MOV EAX,DWORD PTR [EBP-0x8] ; VAR:wa <pe +_watcher *> + 0x363D7C: MOV EAX,DWORD PTR [EAX+0x20] ; TRAP OCCUR +S HERE <<<<<<<<<<<<<<<<< 0x363D7F: AND EAX,0x1 0x363D82: TEST EAX,EAX 0x363D84: JZ 0x363DB0 ; (*+0x2C) 0x363D86: MOV EAX,DWORD PTR [EBP-0x8] ; VAR:wa <pe +_watcher *> 0x363D89: MOV EAX,DWORD PTR [EAX+0x20] 0x363D8C: AND EAX,0x4000 0x363D91: TEST EAX,EAX 0x363D93: JZ 0x363DB0 ; (*+0x1D) 0x363D95: MOV EAX,DWORD PTR [EBP-0x8] ; VAR:wa <pe +_watcher *> 0x363D98: MOV EAX,DWORD PTR [EAX+0x20] 0x363D9B: AND EAX,0x2000 0x363DA0: TEST EAX,EAX 0x363DA2: JZ 0x363DB0 ; (*+0xE) ; ev.c - Line 188 ; pe_watcher_on(wa, 1); 0x363DA4: PUSH 0x1 0x363DA6: PUSH DWORD PTR [EBP-0x8] ; VAR:wa <pe +_watcher *> 0x363DA9: CALL 0x3642EA ; SYM:pe_wat +cher_on <Char *> 0x363DAE: POP ECX 0x363DAF: POP ECX ; ev.c - Line 189 ; if (Estat.on) { 0x363DB0: CMP DWORD PTR [0x10014268],0x0 ; <==0x00363 +DA2(*-0xE), 0x00363D93(*-0x1D), 0x00363D84(*-0x2C) 0x363DB7: JZ 0x363E2C ; (*+0x75) ; ev.c - Line 190 ; if (fp->stats) { 0x363DB9: MOV EAX,DWORD PTR [EBP+0x8] ; ARG:fp <pe +_cbframe *> 0x363DBC: CMP DWORD PTR [EAX+0x8],0x0 0x363DC0: JZ 0x363DDA ; (*+0x1A) ; ev.c - Line 191 ; Estat.scrub(fp->stats, wa); 0x363DC2: PUSH DWORD PTR [EBP-0x8] ; VAR:wa <pe +_watcher *> 0x363DC5: MOV EAX,DWORD PTR [EBP+0x8] ; ARG:fp <pe +_cbframe *> 0x363DC8: PUSH DWORD PTR [EAX+0x8] 0x363DCB: CALL DWORD PTR [0x1001427C] 0x363DD1: POP ECX 0x363DD2: POP ECX ; ev.c - Line 192 ; fp->stats = 0; 0x363DD3: MOV EAX,DWORD PTR [EBP+0x8] ; ARG:fp <pe +_cbframe *> 0x363DD6: AND DWORD PTR [EAX+0x8],0x0 ; ev.c - Line 194 ; } ; if (CurCBFrame >= 0) { 0x363DDA: CMP DWORD PTR [0x10012020],0x0 ; <==0x00363 +DC0(*-0x1A) 0x363DE1: JL 0x363E2C ; (*+0x4B) ; ev.c - Line 195 ; pe_cbframe *pfp = CBFrame + CurCBFrame; 0x363DE3: MOV EAX,DWORD PTR [0x10012020] 0x363DE8: IMUL EAX,EAX,0xC 0x363DEB: ADD EAX,0x10014438 0x363DF0: MOV DWORD PTR [EBP-0xC],EAX ; VAR:pfp <p +e_cbframe *> ; ev.c - Line 196 ; if (!pfp->stats) 0x363DF3: MOV EAX,DWORD PTR [EBP-0xC] ; VAR:pfp <p +e_cbframe *> 0x363DF6: CMP DWORD PTR [EAX+0x8],0x0 0x363DFA: JNZ 0x363E1F ; (*+0x25) ; ev.c - Line 197 ; pfp->stats = Estat.enter(CurCBFrame, pfp->ev->up->max_cb_t +m); 0x363DFC: MOV EAX,DWORD PTR [EBP-0xC] ; VAR:pfp <p +e_cbframe *> 0x363DFF: MOV EAX,DWORD PTR [EAX] 0x363E01: MOV EAX,DWORD PTR [EAX+0x8] 0x363E04: MOVSX EAX,DWORD PTR [EAX+0x48] 0x363E08: PUSH EAX 0x363E09: PUSH DWORD PTR [0x10012020] 0x363E0F: CALL DWORD PTR [0x1001426C] 0x363E15: POP ECX 0x363E16: POP ECX 0x363E17: MOV ECX,DWORD PTR [EBP-0xC] ; VAR:pfp <p +e_cbframe *> 0x363E1A: MOV DWORD PTR [ECX+0x8],EAX ; ev.c - Line 198 ; else 0x363E1D: JMP 0x363E2C ; (*+0xF) ; ev.c - Line 199 ; Estat.resume(pfp->stats); 0x363E1F: MOV EAX,DWORD PTR [EBP-0xC] ; VAR:pfp <p +e_cbframe *>; <==0x00363DFA(*-0x25) 0x363E22: PUSH DWORD PTR [EAX+0x8] 0x363E25: CALL DWORD PTR [0x10014274] 0x363E2B: POP ECX ; ev.c - Line 203 ; } ; } ; /* this must be last because it can destroy the watcher */ ; pe_event_release(ev); 0x363E2C: PUSH DWORD PTR [EBP-0x4] ; VAR:ev <pe +_event *>; <==0x00363DE1(*-0x4B), 0x00363E1D(*-0xF), 0x00363DB7(*-0x7 +5) 0x363E2F: CALL 0x363E37 ; SYM:pe_eve +nt_release <Void> 0x363E34: POP ECX ; ev.c - Line 204 ; } 0x363E35: LEAVE 0x363E36: RET ;******************************************************************* +*************
And a stack trace:
PID: 4020 TID: 4192 - Stack Contents for 0x00363D7C 0x00363D7C: Event.dll:pe_event_postCB + 0x0025 <Void> 0x00363C6F: Event.dll:pe_event_invoke + 0x0738 <Void> 0x00364EA1: Event.dll:pe_empty_queue + 0x0031 <Int> 0x00364ACC: Event.dll:one_event + 0x00ED <Int> 0x280933F9: Perl_get_context + 0x001F 0x00365A0E: Event.dll:XS_Event__loop + 0x011B <Void> 0x2804002B: Perl_sv_compile_2op + 0x7B9F 0x2805D4AF: Perl_runops_standard + 0x000C 0x28088A87: RunPerl + 0x0086 0x77F53CB3: RtlDosPathNameToNtPathName_U + 0x02E3 0x00401012: 0x77E814C7: GetCurrentDirectoryW + 0x0044
I'm intrigued by what you are trying to achieve by mixing these two anyway?
|
|---|