Chinaunix

标题: 关于coredump中打印出来的“_malloc_unlocked” [打印本页]

作者: jameslai08    时间: 2016-10-09 16:33
标题: 关于coredump中打印出来的“_malloc_unlocked”
被一个问题困扰了很久:
是关于solaris上面C++的一个coredump。
把core文件的调用栈打印出来如下, 最后一个调用是“_malloc_unlocked”, 这个是标准库里面的东西,对应的代码也就是初始化了一个ifstream对象。

网上google了半天, 说这个是内存哪里出错了; 但是根据这个调用栈,似乎无法定位问题所在。
也就是说最后出问题的地方是初始化ifstream的地方,但是这里的代码并没有错误,是其他不知道什么地方的内存操作有问题,只是刚好到ifstream这里core了。

不知大神们有何看法?
我主要是想确认这个调用栈是否可以定位到哪里内存操作错误?或者还有其他什么办法来定位?
谢谢!!!!

调用栈:
Loading modules: [ libc.so.1 libuutil.so.1 ld.so.1 ]
> ::stack
libc.so.1`_malloc_unlocked+0x164(2008, 0,4b08900, ff, ffffffff, ff)
libc.so.1`malloc+0x4c(2001, 1, ea714, 0, fedb23e8, fedbc5d
libCrun.so.1`__1c2n6FI_pv_+0x28(2001, 0, 0, 15d74, fee8cd10, 0)
libCstd.so.1`__1cDstdNbasic_filebuf4Ccn0ALchar_traits4Cc___Eopen6Mpkcil_p1_+0xc0(ffbfcec8,ab800, 2000, 1b6, ffbfcec8, 0)
libCstd.so.1`__1cDstdObasic_ifstream4Ccn0ALchar_traits4Cc___Eopen6Mpkcil_v_+0x88(ffbfceb8,ab800, 4, 1b6, 78, 89004)
libCstd.so.1`__1cDstdObasic_ifstream4Ccn0ALchar_traits4Cc___2t6Mpkcil_v_+0x9c(ffbfceb8,ab800, 4, 1b6, 320, ffbfcec

libcmLogclnt.so`__1cUDConfiguratorImplCVdoConvertAndConfigure6MrknDstdMbasic_string4Ccn0BLchar_traits4Cc__n0BJallocator4Cc_
...


对应的代码:
        std::ifstream initFile(initFileName.c_str());
        if (!initFile)
          {

                throw log4cpp::ConfigureFailure(std::string("File " + initFileName + " does not exist";
           return;
        }



作者: VIP_fuck    时间: 2016-10-09 16:59
定义一个 ifstream 就会 core 掉,这个没见过。。。
作者: jameslai08    时间: 2016-10-09 17:05
是啊,从调用栈看, DConfiguratorImpl是我们的自己写的代码,接下来一层就是“basic_ifstream”, 对应到代码就是那一句。 所以有点晕了。。。如果是代码其他部分的问题,似乎就没有什么办法来追踪了。。。

调用栈:
Loading modules: [ libc.so.1 libuutil.so.1 ld.so.1 ]
> ::stack
libc.so.1`_malloc_unlocked+0x164(2008, 0,4b08900, ff, ffffffff, ff)
libc.so.1`malloc+0x4c(2001, 1, ea714, 0, fedb23e8, fedbc5d
libCrun.so.1`__1c2n6FI_pv_+0x28(2001, 0, 0, 15d74, fee8cd10, 0)
libCstd.so.1`__1cDstdNbasic_filebuf4Ccn0ALchar_traits4Cc___Eopen6Mpkcil_p1_+0xc0(ffbfcec8,ab800, 2000, 1b6, ffbfcec8, 0)
libCstd.so.1`__1cDstdObasic_ifstream4Ccn0ALchar_traits4Cc___Eopen6Mpkcil_v_+0x88(ffbfceb8,ab800, 4, 1b6, 78, 89004)
libCstd.so.1`__1cDstdObasic_ifstream4Ccn0ALchar_traits4Cc___2t6Mpkcil_v_+0x9c(ffbfceb8,ab800, 4, 1b6, 320, ffbfcec
libcmLogclnt.so`__1cUDConfiguratorImplCVdoConvertAndConfigure6MrknDstdMbasic_string4Ccn0BLchar_traits4Cc__n0BJallocator4Cc_
...

作者: drangon    时间: 2016-10-10 22:59
这种问题,一般就是因为某个地方写越界了,破坏了malloc内部的链表,等到以后某次malloc或者free访问到相关内存,就挂了,

这种问题的确难调试,要么就是去review一下各种可能越界的地方,要么用valgrind等工具去抓住越界的地方
作者: lxyscls    时间: 2016-10-11 10:22
踩内存,不要怀疑libc,即便有bug,也是因为用的有问题造成的
作者: jameslai08    时间: 2016-10-11 12:33
关键是问题还不能重现。。半年发生了2,3次。。。另外valgrind似乎不支持SPARC solaris




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2