NetBSD-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: track down why malloc fails

Christos Zoulas wrote:
> In article <>,
>  <> wrote:
> >How to track down why the second account cannot allocate the memory?  
> ktrace the command.  

Done.  I've ruled out insufficient memory as the cause, and I don't
understand how to read the kdump output.  

I'm also kind of at a loss.  I don't know whether I'm dealing with an
application error (asking for too much memory) or a system configuration
error (somehow refusing to provide memory that could be made available).  

Is there nothing similar to time(1) for memory?  I would love to know 1)
the high-water mark for a process after it runs and 2) the amount of
memory in use and the amount requested requested at the time malloc
failed.  (Details on why it failed would be nice, too.) 

Regarding ulimit, I put "ulimit -a" in the script and got this output:

time(seconds)        unlimited
file(blocks)         unlimited
data(kbytes)         131072
stack(kbytes)        2048
coredump(blocks)     unlimited
memory(kbytes)       245740
locked memory(kbytes) 81913
process(processes)   160
nofiles(descriptors) 64

That tells me the process can allocate 256 MB of memory.  That's plenty. 
For one thing, my own ulimit is the same.  For another, we're only doing
"svn commit".  Finally, the machine has only 256 MB RAM.  If the process
came anywhere close to allocating all physcical memory, the other
processes would all swap out and the machine would crawl.  

So I have enough memory, and a bug.  But it's pernicious, because it crops
up in different places (if gdb bt is to be believed) and is repeatable
only in the dark of night.  

The ktrace.out was 757,271,470 bytes.  What's odd is that when I re-ran
the job this morning (under my account) the ktrace.out is 10% of that
size: 85,489,521 bytes.  

Last night's ktrace fingers mmap(2) as the culprit.  I don't know how to
read the dump, though.  Here's the end of it:

        K 25
        V 109
 28999 svn      GIO   fd 4 read 8 bytes
 28999 svn      RET   read 4096/0x1000
 28999 svn      CALL  break(0x10059000)
 28999 svn      RET   break 0
 28999 svn      CALL  break(0x1005b000)
 28999 svn      RET   break 0
 28999 svn      CALL  mmap(0,0x21000,3,0x1002,0xffffffff,0,0,0)
                                       [MAP_PRIVATE, MAP_ANON]
 28999 svn      RET   mmap -1 errno 12 Cannot allocate memory

The mmap man page says mmap has 6 arguments.  The kdump output above shows

This looks to me like we're trying to allocate 135,168 bytes at an address
of mmap's choosing.  Is that what it says?  The fd argument appears to be
-1, but in that case (according to the docs) mmap should return EBADF or
perhaps EACCES.  
We're running with MALLOC_OPTIONS=X here, so the end of the story arrives

 28999 svn      CALL  break(0x10059000)
 28999 svn      RET   break 0
 28999 svn      CALL  write(2,0xbfbffb0c,3)
 28999 svn      GIO   fd 2 wrote 3 bytes
 28999 svn      RET   write 3
 28999 svn      CALL  write(2,0x4840a4fa,0xd)
 28999 svn      GIO   fd 2 wrote 13 bytes
       " in malloc():"
 28999 svn      RET   write 13/0xd
 28999 svn      CALL  write(2,0x4840a444,8)
 28999 svn      GIO   fd 2 wrote 8 bytes
       " error: "
 28999 svn      RET   write 8
 28999 svn      CALL  write(2,0x4840a508,0xf)
 28999 svn      GIO   fd 2 wrote 15 bytes
       "out of memory.
 28999 svn      RET   write 15/0xf
 28999 svn      CALL  __sigprocmask14(3,0x482055c4,0)
 28999 svn      RET   __sigprocmask14 0
 28999 svn      CALL  getpid
 28999 svn      RET   getpid 28999/0x7147, 15783/0x3da7
 28999 svn      CALL  kill(0x7147, SIGABRT)
 28999 svn      RET   kill 0
 28999 svn      PSIG  SIGABRT SIG_DFL
 28999 svn      NAMI  "svn.core"

What to do?  Suggestions only welcome.  



Home | Main Index | Thread Index | Old Index