On Monday 13 October 2008 16:15:54 chromatic wrote:
> That's pretty clearly not a PMC. Can you use the breakpoint
> technique to figure out 1) What creates this CPointer PMC and
In the following dump, the offending PMC ix 0x1731de8. The arena's base
pointer varies every time, but I seem to be able to catch it with a
pointer suffix check.
Breakpoint 3, Parrot_CPointer_init (interp=0x1f99080, pmc=0x20f3de8)
at ./src/pmc/cpointer.pmc:67
67 mem_allocate_typed(Parrot_CPointer_attributes);
(gdb) bt
#0 Parrot_CPointer_init (interp=0x1f99080, pmc=0x20f3de8)
at ./src/pmc/cpointer.pmc:67
#1 0x00007fa669216be0 in pmc_new (interp=0x1f99080, base_type=52)
at src/pmc.c:93
#2 0x00007fa6691dfe74 in Parrot_build_sig_object_from_varargs (
interp=0x1f99080, sig=0x7fa66944bb33 "PPP->P", args=0x7fff71a10230)
at src/multidispatch.c:477
#3 0x00007fa6691e05c6 in Parrot_mmd_multi_dispatch_from_c_args (
interp=0x1f99080, name=0x7fa66944c310 "modulus",
sig=0x7fa66944bb33 "PPP->P") at src/multidispatch.c:574
#4 0x00007fa6692c159f in Parrot_default_modulus (interp=0x1f99080,
pmc=0x20f3f00, value=0x2072a08, dest=0x2071e70)
at ./src/pmc/default.pmc:1673
#5 0x00007fa669172af8 in Parrot_mod_p_p_p (cur_opcode=0x20f36a0,
interp=0x1f99080) at src/ops/math.ops:760
#6 0x00007fa669217c2f in runops_slow_core (interp=0x1f99080,
pc=0x20f36a0)
at src/runops_cores.c:222
#7 0x00007fa6691d7ed4 in runops_int (interp=0x1f99080, offset=0)
at src/interpreter.c:937
#8 0x00007fa6691d88c3 in runops (interp=0x1f99080, offs=0)
at src/inter_run.c:101
#9 0x00007fa6691d8b7a in runops_args (interp=0x1f99080, sub=0x20738b0,
obj=0x2026020, meth_unused=0x0, sig=0x7fa669442cfb "vP",
ap=0x7fff71a10500)
at src/inter_run.c:236
#10 0x00007fa6691d8d6b in Parrot_runops_fromc_args (interp=0x1f99080,
sub=0x20738b0, sig=0x7fa669442cfb "vP") at src/inter_run.c:300
#11 0x00007fa6691ba81e in Parrot_runcode (interp=0x1f99080, argc=1,
argv=0x7fff71a107e0) at src/embed.c:951
#12 0x00007fa66941bf38 in imcc_run_pbc (interp=0x1f99080, obj_file=0,
output_file=0x0, argc=1, argv=0x7fff71a107e0) at
compilers/imcc/main.c:791
#13 0x00007fa66941c837 in imcc_run (interp=0x1f99080,
sourcefile=0x7fff71a11165 "t/op/bitwise_27.pir", argc=1,
argv=0x7fff71a107e0) at compilers/imcc/main.c:1079
#14 0x0000000000400c64 in main (argc=1, argv=0x7fff71a107e0) at
src/main.c:61
(gdb) cont
Continuing.
Breakpoint 4, Parrot_CPointer_set_pointer (interp=0x1f99080,
pmc=0x20f3de8,
value=0x7fff71a10358) at ./src/pmc/cpointer.pmc:167
167 Parrot_CPointer_attributes * const data =
PARROT_CPOINTER(SELF);
(gdb) bt
#0 Parrot_CPointer_set_pointer (interp=0x1f99080, pmc=0x20f3de8,
value=0x7fff71a10358) at ./src/pmc/cpointer.pmc:167
#1 0x00007fa6691e0189 in Parrot_build_sig_object_from_varargs (
interp=0x1f99080, sig=0x7fa66944bb33 "PPP->P", args=0x7fff71a10230)
at src/multidispatch.c:497
#2 0x00007fa6691e05c6 in Parrot_mmd_multi_dispatch_from_c_args (
interp=0x1f99080, name=0x7fa66944c310 "modulus",
sig=0x7fa66944bb33 "PPP->P") at src/multidispatch.c:574
#3 0x00007fa6692c159f in Parrot_default_modulus (interp=0x1f99080,
pmc=0x20f3f00, value=0x2072a08, dest=0x2071e70)
at ./src/pmc/default.pmc:1673
#4 0x00007fa669172af8 in Parrot_mod_p_p_p (cur_opcode=0x20f36a0,
interp=0x1f99080) at src/ops/math.ops:760
#5 0x00007fa669217c2f in runops_slow_core (interp=0x1f99080,
pc=0x20f36a0)
at src/runops_cores.c:222
#6 0x00007fa6691d7ed4 in runops_int (interp=0x1f99080, offset=0)
at src/interpreter.c:937
#7 0x00007fa6691d88c3 in runops (interp=0x1f99080, offs=0)
at src/inter_run.c:101
#8 0x00007fa6691d8b7a in runops_args (interp=0x1f99080, sub=0x20738b0,
obj=0x2026020, meth_unused=0x0, sig=0x7fa669442cfb "vP",
ap=0x7fff71a10500)
at src/inter_run.c:236
#9 0x00007fa6691d8d6b in Parrot_runops_fromc_args (interp=0x1f99080,
sub=0x20738b0, sig=0x7fa669442cfb "vP") at src/inter_run.c:300
#10 0x00007fa6691ba81e in Parrot_runcode (interp=0x1f99080, argc=1,
argv=0x7fff71a107e0) at src/embed.c:951
#11 0x00007fa66941bf38 in imcc_run_pbc (interp=0x1f99080, obj_file=0,
output_file=0x0, argc=1, argv=0x7fff71a107e0) at
compilers/imcc/main.c:791
#12 0x00007fa66941c837 in imcc_run (interp=0x1f99080,
sourcefile=0x7fff71a11165 "t/op/bitwise_27.pir", argc=1,
argv=0x7fff71a107e0) at compilers/imcc/main.c:1079
#13 0x0000000000400c64 in main (argc=1, argv=0x7fff71a107e0) at
src/main.c:61
(gdb) print *pmc
$3 = {cache = {_b = {_bufstart = 0x20f3db0, _buflen = 0}, _ptrs = {
_struct_val = 0x20f3db0, _pmc_val = 0x0}, _i = {_int_val =
34553264,
_int_val2 = 0}, _num_val = 1.7071580694083094e-316,
_string_val = 0x20f3db0}, flags = 72353280, vtable = 0x1ffbf30,
data = 0x2135c00, pmc_ext = 0x2125418, real_self = 0x20f3de8}
(gdb) print *((Parrot_CPointer_attributes *) 0x2135c00)
$4 = {pointer = 0x7fff71a10358, sig = 0x0}
> 2) What's setting an invalid pointer-to-a-PMC here?
I'm not sure anything is. It looks to me like the CPointer is still
intact, and that the GC is interpreting it wrong:
Program received signal SIGSEGV, Segmentation fault.
0x00007fa6691c7b4b in pobject_lives (interp=0x1f99080,
obj=0x7fa6691461ab)
at src/gc/dod.c:206
206 PObj_live_SET(obj);
(gdb) up
#1 0x00007fa6693835b9 in Parrot_CPointer_mark (interp=0x1f99080,
pmc=0x20f3de8) at ./src/pmc/cpointer.pmc:97
97 pobject_lives(interp, (PObj *) *pmc_pointer);
(gdb) print *pmc
$5 = {cache = {_b = {_bufstart = 0x20f3db0, _buflen = 0}, _ptrs = {
_struct_val = 0x20f3db0, _pmc_val = 0x0}, _i = {_int_val =
34553264,
_int_val2 = 0}, _num_val = 1.7071580694083094e-316,
_string_val = 0x20f3db0}, flags = 74712576, vtable = 0x1ffbf30,
data = 0x2135c00, pmc_ext = 0x2125418, real_self = 0x20f3de8}
(gdb) print *((Parrot_CPointer_attributes *) 0x2135c00)
$6 = {pointer = 0x7fff71a10358, sig = 0x1fa13b8}
--
Mark