抛出' std :: logic_error'的实例后终止调用

时间:2015-06-28 15:14:09

标签: c++ gcc glibc libmagic

我正在使用C ++来检索有关文件的信息。其中,我想找出给定文件的MIME类型。

为此,我使用libmagic如下:

#include <iostream>
#include <string>
#include <magic.h>

void foo (std::string path)
{
     magic_t magic;
     magic = magic_open (MAGIC_MIME_TYPE);
     magic_load(magic, NULL);
     magic_compile(magic, NULL);
     std::string filetype (magic_file(magic, path.c_str()));
     magic_close(magic);

     std::cout << filetype << std::endl;
}

int main(int argc, char *argv[])
{
    std::string str = "test.cxx";

    foo (str);

    return 0;
}

尝试使用gcc 4.9.2glibc 2.19在Debian Jessie上运行的计算机,它运行正常。

但是,在使用gcc 5.1.0glibc 2.21的arch linux上的另一台计算机上,我在运行时有以下内容:

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct null not valid

gdb为我提供了更多信息:

Program received signal SIGABRT, Aborted.
0x00007ffff6fb1528 in raise () from /usr/lib/libc.so.6

#0  0x00007ffff6fb1528 in raise () from /usr/lib/libc.so.6
#1  0x00007ffff6fb293a in abort () from /usr/lib/libc.so.6
#2  0x00007ffff78c9b3d in __gnu_cxx::__verbose_terminate_handler ()
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/libsupc++/vterminate.cc:95
#3  0x00007ffff78c7996 in __cxxabiv1::__terminate (handler=<optimized out>)
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/libsupc++/eh_terminate.cc:47
#4  0x00007ffff78c79e1 in std::terminate ()
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/libsupc++/eh_terminate.cc:57
#5  0x00007ffff78c7bf8 in __cxxabiv1::__cxa_throw (obj=0x613fb0, 
    tinfo=0x7ffff7baea78 <typeinfo for std::logic_error>, 
    dest=0x7ffff78dd040 <std::logic_error::~logic_error()>)
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/libsupc++/eh_throw.cc:87
#6  0x00007ffff78f08bf in std::__throw_logic_error (
    __s=__s@entry=0x7ffff7976100 "basic_string::_S_construct null not valid")
    at /build/gcc/src/gcc-5-20150519/libstdc++-v3/src/c++11/functexcept.cc:74
#7  0x00007ffff790acef in std::string::_S_construct<char const*> (__beg=<optimized out>, 
    __end=<optimized out>, __a=...)
    at /build/gcc/src/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:577
#8  0x00007ffff790b0e6 in _S_construct_aux<char const*> (__a=..., __end=<optimized out>, 
    __beg=0x0)
    at /build/gcc/src/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.h:4136
#9  _S_construct<char const*> (__a=..., __end=<optimized out>, __beg=0x0)
    at /build/gcc/src/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string---Type <return> to continue, or q <return> to quit---
.h:4157
#10 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (
    this=0x7fffffffe980, __s=0x0, __a=...)
    at /build/gcc/src/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:659
#11 0x0000000000400df3 in foo (path="test.cxx") at test.cxx:11
#12 0x0000000000400ece in main (argc=1, argv=0x7fffffffeae8) at test.cxx:21

所以我不确定我是否可以解决我的问题,或者是否存在来自glibc或libmagic的错误?

0 个答案:

没有答案