|
github.com/moarvm/moarvm | IRC logs at colabti.org/irclogger/irclogger_logs/moarvm Set by AlexDaniel on 12 June 2018. |
|||
|
02:08
lucasb left
02:57
raku-bridge left,
raku-bridge joined
03:58
Kaeipi left
03:59
Kaeipi joined
06:31
raku-bridge left
07:52
Kaeipi left,
Kaeipi joined
08:07
domidumont joined
08:15
MasterDuke joined
08:20
Kaeipi left
08:22
Kaeipi joined
08:26
domidumont left
08:49
domidumont joined
08:57
zakharyas joined
09:24
Altai-man joined
09:43
patrickb joined
09:57
patrickb left
|
|||
| MasterDuke | is github.com/MoarVM/MoarVM/blob/mast...#L474-L539 missing an MVMROOT? if i'm rr'ing correctly (somewhat doubtful to be honest) it seems to indicate this is where the location of an sc_ix gets changed from 0 to 4294967295 | 09:58 | |
| tellable6 | 2020-11-17T03:50:57Z #raku-dev <melezhik> MasterDuke: ^^ | ||
| MasterDuke | re nine's comment here github.com/rakudo/rakudo/issues/40...-728777480 i did `watch -l watch -l worklist->list[worklist->items]` at the point of the segv, but all i get is `Old value = <unreadable>; New value = (MVMCollectable **) 0x0` when i reverse-cont (or continue from start) | 10:15 | |
| did i do that watchpoint correctly? | 10:17 | ||
| (copy pasta, i only had one `watch -l` when i actually entered it in rr) | 10:18 | ||
|
10:32
Kaeipi left,
Kaiepi joined
|
|||
| nine | MasterDuke: worklist->list[worklist->items] is the next free slot for adding to the worklist | 10:34 | |
| MasterDuke: you actually want to watch -l gen2roots[i] | 10:35 | ||
| MasterDuke | where's the i from? | 10:43 | |
| tc->gen2roots[sc_idx]? | 10:45 | ||
| nine | the MVM_gc_root_add_gen2s_to_worklist frame | 10:46 | |
| MasterDuke | ah, thanks | 10:47 | |
| ok, i added that, reverse-cont, it hits | 10:50 | ||
| nine | Is the object still intact at that point? | 10:51 | |
| MasterDuke | we're at `tc->gen2roots[tc->num_gen2roots] = c;` in MVM_gc_root_gen2_add | 10:53 | |
| guess i'm interested in the `c`? | |||
| sc = {sc_idx = 4048871824, idx = 21871} | 10:55 | ||
| nine | So, already broken when it gets added to gen2roots. Where are we at that point? | 10:56 | |
| MasterDuke | set_obj_at_offset in src/6model/reprs/P6opaque.c:21; bind_attribute in src/6model/reprs/P6opaque.c:389; | ||
| nine | where does the value come from? | 10:57 | |
| MVM_dump_bytecode(tc) comes in handy at that point | |||
| timotimo | i recommend routinely asking gdb for "event" | ||
| i think that's how you spell that command at least | 10:58 | ||
| gives you a numbe you can use to return to this moment in "time" | |||
| nine | isn't that checkpoint? | ||
| MasterDuke | gist.github.com/MasterDuke17/f2630...3e48e0e72f what i have so far | 10:59 | |
| nine | So you're in line 77 and the broken object is loc_8_obj, i.e. tc->cur_frame->work[8].o | 11:01 | |
| and it's the result of getlex in 70 | |||
| That's odd, since that's simply the %spec argument to trait_mod:<is>(Routine:D $r, :prec(%spec)!) | 11:03 | ||
| So I'd figure that it's not a missing MVMROOT of that object, but something else overwriting it. Thus a watch -l c->sc_forward_u.sc.sc_idx and reverse-cont | 11:04 | ||
| MasterDuke | old: 23; new: 30 | 11:05 | |
| nine | Oh boy, I'm spending too much time on things like that. I didn't even have to look anywhere to type that command... | ||
| wait, 23? that's a sane number | |||
| MasterDuke | in rebless | ||
| should i go forward again to the segv and then reverse? | 11:07 | ||
| nine | I'd do that, yes. It's always better to be too careful and confirm results than to follow the wrong lead | 11:10 | |
| MasterDuke | old: 4045642928; new: 31 | 11:11 | |
| nine | that's the spot! | ||
| MasterDuke | deserialize | ||
| nine | huh | 11:12 | |
| MasterDuke | gist updated | ||
| nine | That's wrong: p (MVMObject)c | 11:19 | |
| Should read p *(MVMObject*)c | |||
| MasterDuke | $8 = {header = {sc_forward_u = {forwarder = 0x1600000017, sc = {sc_idx = 23, idx = 22}, st = 0x1600000017}, owner = 1, flags1 = 0 '\000', flags2 = 2 '\002', size = 144}, st = 0x556feffaa300} | 11:39 | |
| nine | so that's actually ok there | 11:40 | |
| if you still got that watch -l c->sc_forward_u.sc.sc_idx active, you can just cont to see where it gets overwritten | |||
| MasterDuke | from when the gen2roots[i] hits? | 11:41 | |
| nine | yes | 11:42 | |
| MasterDuke | just to be sure i'm doing the steps right, i continued to the segv, reverse-continued to when the watch -l gen2roots[i] hit, then continued | 11:44 | |
| the first watch -l c->sc_forward_u.sc.sc_idx gives old: 23; new 31 | 11:45 | ||
| next gives old:31; new: 4045642928 | |||
| nine | Sounds good. Since we know that the object is ok when it gets added to gen2roots, you can also just watch -l c->sc_forward_u.sc.sc_idx when it segfaults and reverse-cont | ||
| ok the old:31; new: 4045642928 is where it gets interesting | |||
| where is that? | |||
| MasterDuke | gist updated, rr3.log | 11:46 | |
| fyi, this has been run with MVM_SPESH_DISABLE=1 (segvs with or without, i just thought it'd make things simpler) | 11:49 | ||
| nine | oh, good | ||
| is tc->allocate_in_gen2 set? | 11:50 | ||
| MasterDuke | $9 = 1 | ||
| nine | So, the collectable that gets overwritten is at 0x556ff154e190 | 11:54 | |
| The P6Opaque that's deserialized is at address 0x556ff154e118 | |||
| And we're writing 0x78 bytes in, i.e. at 0x556FF154E190 | 11:55 | ||
| That seems to suggest that the c pointer is in fact outdated and points at a freed or moved object. | 11:56 | ||
| Btw. have you tried with GC_DEBUG enabled? | 11:57 | ||
| Since it's clearly a GC issue that might help and at least explode earlier | |||
| MasterDuke | haven't | ||
| nine | Pro tip to rr users: clean your ~/.local/share/rr from time to time... | 11:59 | |
| MasterDuke | `MoarVM panic: SC index out of range`, no surprise... | 12:01 | |
| with GC_DEBUG=2 | |||
| seems to be the same thing. sc_idx is fine when the gen2roots[i] hits, crazy new value is in deserialize | 12:08 | ||
| just dies at the panic instead of a segv | 12:09 | ||
|
12:11
sena_kun joined
12:13
Altai-man left
|
|||
| nine | Since the issue is that we operate with an outdated pointer to an object, GCing more often with GC_DEBUG=3 may help shake out the actual place where we miss the MVMROOT | 12:14 | |
| MasterDuke | so slow... | 12:15 | |
| nine | I know... OTOH it can run unattended | ||
| MasterDuke | another panic, sc_idx = 3532567984. but MVM_gc_root_add_gen2s_to_worklist is not in the backtrace | 12:32 | |
| but we do seem to be much earlier in the runtime. we're in gen/moar/stage2/QRegex.nqp:868 | 12:38 | ||
|
12:44
zakharyas left
|
|||
| MasterDuke | still, same crazy sc_id set in deserialize | 13:14 | |
| nine | so you'll have to trace c back to where it comes from | 13:15 | |
| MasterDuke | item right? cause we're in github.com/MoarVM/MoarVM/blob/mast...ect.c#L348 | 13:24 | |
| nine | yeah, the broken object | 13:25 | |
| MasterDuke | is github.com/MoarVM/MoarVM/blob/mast...1876-L1877 correct? here github.com/MoarVM/MoarVM/blob/mast...1876-L1877 value is rooted before allocate() is called | 13:32 | |
| timotimo | where is the root? | 13:33 | |
| oh, it gets put into the egister | |||
| nine | MasterDuke: the comment above it explains | ||
| MasterDuke | well yeah, but the comment is repeated in clone | 13:34 | |
| nine | and both are correct | 13:35 | |
| MasterDuke | ah. value is used later in clone. though the comment has a type, there's no 'obj' in clone | 13:37 | |
| *typo | 13:38 | ||
| ugh, i did `watch -l item`, but that's just hitting for every call of process_worklist | 13:45 | ||
| nine | where do you want it to break? | 13:48 | |
| MasterDuke | well, i guess that could be fine. i'm just not 100% sure which call to process_worklist i care about | 13:50 | |
| the first one before the sc_idx goes crazy? | 13:51 | ||
| nine | I'd say you want to know where it entered the worklist | ||
| You already know where and how sc_idx gets overwritten. That didn't help because it's obviously not the writer's fault. It's the fault of whoever holds a pointer to an object and lets it get out-dated | 13:52 | ||
|
14:21
zakharyas joined
14:39
MasterDuke left
|
|||
| timotimo | i wonder what we must do to make perf report able to annotate jitted frames | 15:16 | |
| with the perf map it can tell us which piece in the output belongs to what pel6-level frame | 15:17 | ||
|
16:04
MasterDuke joined
16:10
Altai-man joined
16:12
patrickb joined
16:13
sena_kun left
16:20
MasterDuke left
16:46
MasterDuke joined
17:05
lucasb joined
17:21
patrickb left
18:30
Kaiepi left
18:31
domidumont left
18:56
zakharyas left
|
|||
| MasterDuke | hm, where was i | 20:01 | |
| looks like i did `watch -l *item` for some reason | |||
|
20:03
brrt joined
20:11
sena_kun joined
|
|||
| brrt | \o | 20:11 | |
| nwc10 | o/ | 20:12 | |
|
20:12
Altai-man left
21:07
brrt left
21:27
zakharyas joined
21:42
zakharyas left
|
|||
| [Coke] | ⏀ | 22:34 | |
|
22:45
sena_kun left
|
|||