Segfaulting programs with GHC 6.4.1

John Goerzen jgoerzen at
Fri Oct 21 08:26:34 EDT 2005

On Fri, Oct 21, 2005 at 10:28:51AM +0100, Simon Marlow wrote:
> On 21 October 2005 10:20, John Goerzen wrote:
> > On Fri, Oct 21, 2005 at 09:52:50AM +0100, Simon Marlow wrote:
> > #0  0x080ba84a in s34n_info ()
> > #6  0x08172728 in MainCapability ()
> > #1878 0x08134aa5 in allocBlock ()
> > #1879 0x080ba95c in s3eu_info ()
> A couple more things to try:  disassemble s34n_info to see where exactly
> it crashed, and if there are any calls in there you recognise, and 'grep
> s34n_info *.o' over your object files to see which object that symbol
> comes from.

It wasn't from my build tree, but:

jgoerzen at katherina:/usr/lib/ghc-6.4.1$ grep -ri s34n_info *
Binary file libHSbase.a matches
Binary file libHSdata.a matches

I unpacked libHSbase.a and found:

$ grep -ri s34n_info .
Binary file ./String__1.o matches
Binary file ./Posix__6.o matches   (this one doesn't match if I omit -i)

Identical results from libHSdata.a.

I thought I would also look at s3eu_info.  It too is in libHSbase.a:

$ grep -r s3eu_info .
Binary file ./Internals__19.o matches
Binary file ./String__1.o matches

objdump -x String__1.o yields, among other things:
00000000 l    d  .text  00000000 .text
00000068 l     O .text  0000000c s34n_info
00000190 l     O .text  00000008 s3et_info
000000c4 l     O .text  00000008 s351_info
00000160 l     O .text  00000008 s3eu_info
00000000 l    d  .data  00000000 .data
00000000 l    d  .bss   00000000 .bss
00000000 g     O .data  00000004
0000000c g     O .text  0000000c ForeignziCziString_zdwpeekCAString_info
00000000         *UND*  00000000 GHCziBase_Izh_con_info
00000000         *UND*  00000000 GHCziBase_Czh_con_info
00000000         *UND*  00000000 GHCziBase_ZC_con_info
00000000         *UND*  00000000 stg_gc_ut
00000000         *UND*  00000000 GHCziBase_ZMZN_closure

Now, I may be totally reading this wrong, but seeing several references
to Foreign and String made me think of CStrings.  That made me
suspicious of this function.  You may remember I asked about it on IRC,
and we thought it was OK:

msg :: String -> IO ()
msg l =
    do t <- myThreadId
       let disp = (show t) ++ ": " ++ l ++ "\n"
       withCStringLen disp (\(c, len) -> hPutBuf stdout c len >> hFlush stdout)

This may be a complete red herring, but I just thought I'd bring it up.
Maybe it's a clue anyway.

Here's the disassemble output:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1407190096 (LWP 31315)]
0x080ba84a in s34n_info ()
(gdb) disassemble s34n_info
Dump of assembler code for function s34n_info:
0x080ba834 <s34n_info+0>:       mov    %edi,0x8(%esp)
0x080ba838 <s34n_info+4>:       mov    %edi,%eax
0x080ba83a <s34n_info+6>:       add    $0x8,%eax
0x080ba83d <s34n_info+9>:       mov    %eax,%edi
0x080ba83f <s34n_info+11>:      cmp    0x5c(%ebx),%eax
0x080ba842 <s34n_info+14>:      ja     0x80ba86b <s34n_info+55>
0x080ba844 <s34n_info+16>:      mov    0x0(%ebp),%edx
0x080ba847 <s34n_info+19>:      mov    0x4(%esi),%eax
0x080ba84a <s34n_info+22>:      cmpb   $0x0,(%eax,%edx,1)
0x080ba84e <s34n_info+26>:      jne    0x80ba877 <s34n_info+67>
0x080ba850 <s34n_info+28>:      mov    0x8(%esp),%eax
0x080ba854 <s34n_info+32>:      movl   $0x80bd4d0,0x4(%eax)
0x080ba85b <s34n_info+39>:      mov    0x0(%ebp),%eax
0x080ba85e <s34n_info+42>:      mov    %eax,(%edi)
0x080ba860 <s34n_info+44>:      lea    0xfffffffc(%edi),%esi
0x080ba863 <s34n_info+47>:      add    $0x4,%ebp
0x080ba866 <s34n_info+50>:      mov    0x0(%ebp),%eax
0x080ba869 <s34n_info+53>:      jmp    *%eax
0x080ba86b <s34n_info+55>:      movl   $0x8,0x6c(%ebx)
0x080ba872 <s34n_info+62>:      mov    0xfffffffc(%ebx),%eax
0x080ba875 <s34n_info+65>:      jmp    0x80ba869 <s34n_info+53>
0x080ba877 <s34n_info+67>:      lea    0x1(%edx),%eax
---Type <return> to continue, or q <return> to quit---
0x080ba87a <s34n_info+70>:      mov    %eax,0x0(%ebp)
0x080ba87d <s34n_info+73>:      sub    $0x8,%edi
0x080ba880 <s34n_info+76>:      mov    $0x80ba834,%eax
0x080ba885 <s34n_info+81>:      jmp    0x80ba869 <s34n_info+53>
0x080ba887 <s34n_info+83>:      nop
0x080ba888 <s34n_info+84>:      and    %eax,(%eax)
0x080ba88a <s34n_info+86>:      add    %al,(%eax)
0x080ba88c <s34n_info+88>:      and    $0x0,%al
0x080ba88e <s34n_info+90>:      add    %al,(%eax)
End of assembler dump.

More information about the Glasgow-haskell-users mailing list