
Deborah Goldsmith wrote:
I asked internally at Apple about this and got the following response:
obvious symptom: stage2 compiler segfaults, gdb reports:
Program received signal SIGTRAP, Trace/breakpoint trap. 0x8fe0100c in __dyld__dyld_start ()
Ignore that. `continue` to actually run the program and get to the real error.
Deborah
Ah, thanks. It seems stage2/ghc-inplace may be a bit stripped, but stage2/ghc-6.8.1 gives a legible backtrace:
pamac-cek10:stage2 chrisk$ gdb ghc-6.8.1 GNU gdb 6.3.50-20050815 (Apple version gdb-768) (Tue Oct 2 04:11:19 UTC 2007) Copyright 2004 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "powerpc-apple-darwin"... warning: Unable to read symbols for "GNUreadline.framework/Versions/A/GNUreadline" (file not found).
warning: Unable to read symbols for "GMP.framework/Versions/A/GMP" (file not found). Reading symbols for shared libraries ... done
(gdb) run --make /tmp/t.hs -o /tmp/t Starting program: /Users/chrisk/Documents/projects/haskell/build/ghc-6.8.1/ghc-6.8.1/compiler/stage2/ghc-6.8.1 --make /tmp/t.hs -o /tmp/t Reading symbols for shared libraries +..+... done
Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x4082000c 0x012ba9c8 in stg_ap_p_fast ()
(gdb) bt #0 0x012ba9c8 in stg_ap_p_fast () #1 0x010d79ec in base_GHCziIOBase_noDuplicate_info () #2 0x01290e58 in schedule (initialCapability=0x41810070, task=0x38600000) at Schedule.c:621 #3 0x012933c8 in scheduleWaitThread (tso=0x2680000, ret=0x0, cap=0x14c4318) at Schedule.c:2500 #4 0x01285040 in rts_evalIO (cap=0x14c4318, p=0x13f40b4, ret=0x0) at RtsAPI.c:476 #5 0x0129d310 in ioManagerStart () at posix/Signals.c:151 #6 0x0128841c in hs_init (argc=0xbffff4a8, argv=0xbffff4ac) at RtsStartup.c:279 #7 0x01288464 in startupHaskell (argc=5, argv=0xbffff594, init_root=0x113cc <__stginit_ZCMain>) at RtsStartup.c:290 #8 0x0127ebbc in real_main () at Main.c:57 #9 0x0127ed1c in main (argc=5, argv=0xbffff594) at Main.c:153
(gdb) disassemble Dump of assembler code for function stg_ap_p_fast: 0x012ba9b0
: andi. r31,r14,3 And Immediate (to get the two least significant bits of r14) 0x012ba9b4 : cmpwi r31,1 Equiv. to cmpi 0,0,r31,1 Compare Immediate 0x012ba9b8 : beq- 0x12ba9e0 Branch if equal (not taken, obviously, since the the next instructions are the fatal ones) 0x012ba9bc : li r31,-4 Load Immediate (I believe -4 is the opposite bit pattern to 3) 0x012ba9c0 : and r14,r14,r31 AND (to clear the two least significant bits of r14) 0x012ba9c4 : lwz r31,0(r14) Load Word and Zero 0x012ba9c8 : lha r31,-4(r31) [ The error was for the above operation: Load Halfword Algebraic destination general purpose register r31
A quick descent of the stack prints the single source lines:
Initial frame selected; you cannot go up.
(gdb) down
#8 0x0127ebbc in real_main () at Main.c:57
57 startupHaskell(progargc,progargv,__stginit_ZCMain);
(gdb) down
#7 0x01288464 in startupHaskell (argc=5, argv=0xbffff594, init_root=0x113cc
<__stginit_ZCMain>) at RtsStartup.c:290
290 hs_init(&argc, &argv);
(gdb) down
#6 0x0128841c in hs_init (argc=0xbffff4a8, argv=0xbffff4ac) at RtsStartup.c:279
279 ioManagerStart();
(gdb) down
#5 0x0129d310 in ioManagerStart () at posix/Signals.c:151
151 rts_evalIO(cap,&base_GHCziConc_ensureIOManagerIsRunning_closure,NULL);
(gdb) down
#4 0x01285040 in rts_evalIO (cap=0x14c4318, p=0x13f40b4, ret=0x0) at RtsAPI.c:476
476 return scheduleWaitThread(tso,ret,cap);
(gdb) down
#3 0x012933c8 in scheduleWaitThread (tso=0x2680000, ret=0x0, cap=0x14c4318) at
Schedule.c:2500
2500 cap = schedule(cap,task);
(gdb) down
#2 0x01290e58 in schedule (initialCapability=0x41810070, task=0x38600000) at
Schedule.c:621
621 r = StgRun((StgFunPtr) stg_returnToStackTop, &cap->r);
(gdb) print r
$1 = (StgRegTable *) 0xabdffffc
(gdb) print &cap->r
$5 = (StgRegTable *) 0x7ddf7380
(gdb) print stg_returnToStackTop
$2 = {
0x012ba9cc
: rlwinm r31,r31,2,0,29 0x012ba9d0 : addis r31,r31,313 0x012ba9d4 : lwz r31,-28940(r31) 0x012ba9d8 : mtctr r31 0x012ba9dc : bctr 0x012ba9e0 : addi r22,r22,0 0x012ba9e4 : lwz r31,-1(r14) 0x012ba9e8 : mtctr r31 0x012ba9ec : bctr 0x012ba9f0 : addi r22,r22,-8 0x012ba9f4 : stw r15,4(r22) 0x012ba9f8 : b 0x12b666c 0x012ba9fc : lwz r31,0(r14) 0x012baa00 : lha r31,-10(r31) 0x012baa04 : cmplwi r31,0 0x012baa08 : bgt- 0x12baa88 0x012baa0c : li r3,0 0x012baa10 : li r4,2441 0x012baa14 : bl 0x1287c80 <_assertFail> 0x012baa18 : cmpwi r31,1 0x012baa1c : beq- 0x12baac8 0x012baa20 : addi r22,r22,-8 0x012baa24 : stw r15,4(r22) 0x012baa28 : cmplwi r31,4 0x012baa2c : blt- 0x12baa8c 0x012baa30 : li r30,16 0x012baa34 : add r25,r25,r30 0x012baa38 : cmplw r25,r26 0x012baa3c : bgt- 0x12baa94 0x012baa40 : addi r29,r25,4 0x012baa44 : subf r30,r30,r29 0x012baa48 : lis r29,298 0x012baa4c : ori r29,r29,60928 0x012baa50 : stw r29,0(r30) 0x012baa54 : addi r31,r31,-1 0x012baa58 : sth r31,4(r30) 0x012baa5c : stw r14,8(r30) 0x012baa60 : li r31,1 0x012baa64 : sth r31,6(r30) 0x012baa68 : li r31,0 0x012baa6c : cmplwi r31,1 0x012baa70 : blt- 0x12baaa8 0x012baa74 : mr r14,r30 0x012baa78 : addi r22,r22,8 0x012baa7c : lwz r31,0(r22) 0x012baa80 : mtctr r31 0x012baa84 : bctr 0x012baa88 : b 0x12baa18 0x012baa8c : add r14,r14,r31 0x012baa90 : b 0x12baa30 0x012baa94 : stw r30,112(r27) 0x012baa98 : lis r31,299 0x012baa9c : ori r31,r31,26220 0x012baaa0 : stw r31,0(r22) 0x012baaa4 : b 0x12af8ac <__stg_gc_enter_1> 0x012baaa8 : addi r29,r31,1 0x012baaac : rlwinm r29,r29,2,0,29 0x012baab0 : lwzx r29,r22,r29 0x012baab4 : addi r28,r30,12 0x012baab8 : rlwinm r23,r31,2,0,29 0x012baabc : stwx r29,r28,r23 0x012baac0 : addi r31,r31,1 0x012baac4 : b 0x12baa6c 0x012baac8 : addi r22,r22,0 0x012baacc : addi r14,r14,1 0x012baad0 : li r31,-4 0x012baad4 : and r31,r14,r31 0x012baad8 : lwz r31,0(r31) 0x012baadc : mtctr r31 0x012baae0 : bctr 0x012baae4 : b 0x12baae4 End of assembler dump.
Where was the evil value in r14 filled in? I look up the stack and
disassemble, but never find the instructions which assign to r14. The
must be in another subroutine (?).
What about printing stuff?
#2 0x01290e58 in schedule (initialCapability=0x41810070, task=0x38600000) at
Schedule.c:621
621 r = StgRun((StgFunPtr) stg_returnToStackTop, &cap->r);
(gdb) list
616 break;
617
618 case ThreadRunGHC:
619 {
620 StgRegTable *r;
621 r = StgRun((StgFunPtr) stg_returnToStackTop, &cap->r);
622 cap = regTableToCapability(r);
623 ret = r->rRet;
624 break;
625 }
#3 0x012933c8 in scheduleWaitThread (tso=0x2680000, ret=0x0, cap=0x14c4318) at
Schedule.c:2500
2500 cap = schedule(cap,task);
(gdb) print *cap
$8 = {
f = {
stgGCEnter1 = 0x12af8ac <__stg_gc_enter_1>,
stgGCFun = 0x12aff54 <__stg_gc_fun>
},
r = {
rR1 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rR2 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rR3 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rR4 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rR5 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rR6 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rR7 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rR8 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rR9 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rR10 = {
w = 0,
a = 0x0,
c = 0,
i8 = 0 '\0',
f = 0,
i = 0,
p = 0x0,
cl = 0x0,
offset = 0,
b = 0x0,
t = 0x0
},
rF1 = 0,
rF2 = 0,
rF3 = 0,
rF4 = 0,
rD1 = 0,
rD2 = 0,
rL1 = 0,
rSp = 0x0,
rSpLim = 0x0,
rHp = 0x0,
rHpLim = 0x0,
rCurrentTSO = 0x2680000,
rNursery = 0x24004d0,
rCurrentNursery = 0x2600fe0,
rCurrentAlloc = 0x2601000,
rHpAlloc = 0,
rmp_tmp_w = 0,
rmp_tmp1 = {
_mp_alloc = 0,
_mp_size = 0,
_mp_d = 0x0
},
rmp_tmp2 = {
_mp_alloc = 0,
_mp_size = 0,
_mp_d = 0x0
},
rmp_result1 = {
_mp_alloc = 0,
_mp_size = 0,
_mp_d = 0x0
},
rmp_result2 = {
_mp_alloc = 0,
_mp_size = 0,
_mp_d = 0x0
},
rRet = 0,
rSparks = {
base = 0x2362000,
lim = 0x2366000,
hd = 0x2362000,
tl = 0x2362000
}
},
no = 0,
running_task = 0x2400580,
in_haskell = rtsTrue,
run_queue_hd = 0x14076d0,
run_queue_tl = 0x14076d0,
suspended_ccalling_tasks = 0x0,
mut_lists = 0x2400320,
spare_workers = 0x0,
lock = {
__sig = 1297437784,
__opaque = '\0'