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

Reply via email to