Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+理解addr2line消息+;STL_C++_Stl_Addr2line - Fatal编程技术网

C++ 使用C+理解addr2line消息+;STL

C++ 使用C+理解addr2line消息+;STL,c++,stl,addr2line,C++,Stl,Addr2line,我遇到了这种罕见的segfault,在调试它时,我设法从addr2line程序中获得了以下输出 void std::string::_S_copy_chars<__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, std::allocator<unsigned char> > > > (char*, __gnu_cxx::__normal_ite

我遇到了这种罕见的segfault,在调试它时,我设法从addr2line程序中获得了以下输出

void std::string::_S_copy_chars<__gnu_cxx::__normal_iterator<unsigned char 
const*, std::vector<unsigned char, std::allocator<unsigned char> > > >
(char*, __gnu_cxx::__normal_iterator<unsigned char const*, 
std::vector<unsigned char, std::allocator<unsigned char> > >,
__gnu_cxx::__normal_iterator<unsigned char const*, std::vector<unsigned char, 
std::allocator<unsigned char> > >)
??:?
void std::string::\u S\u copy\u chars
(char*,uuu gnu cxx::uuu normal_迭代器,
__gnu_cxx::_正常迭代器)
??:?
由于_S_copy_chars()是std::string中的一个私有函数,我显然不是直接调用它。但我猜不出是哪个公共功能在调用它。如果我能找出公共函数,我就可以将导致segfault的null反引用归零

我怀疑以下代码

std::string CInProtocolBase::RetrieveStr(std::vector<unsigned 
char>::const_iterator& iter)
{
    unsigned long sizeOfStr;
    const unsigned char& size = *iter;
    memcpy(&sizeOfStr,&size,4);
    sizeOfStr = 
    boost::asio::detail::socket_ops::network_to_host_long(sizeOfStr);
    std::string str(iter+4,iter+4+sizeOfStr); // <= Could this be culprit??
    iter += (4 + sizeOfStr);
    return str;
}
std::string CInProtocolBase::retrievester(std::vector::const_迭代器&iter)
{
无符号长尺寸FSTR;
常量无符号字符&size=*iter;
memcpy(&sizeOfStr,&size,4);
sizeOfStr=
boost::asio::detail::socket\u ops::网络到主机(sizeOfStr);
std::string str(iter+4,iter+4+sizeOfStr);//带有
memcpy(&sizeOfStr,&size,4)
我看到两个问题

第一个是从一个单字节变量中复制四个字节,这是一个明确的定义

第二个是
sizeOfStr
可能是8个字节(在64位系统上,GCC的
long
通常是64位)。这将使部分变量未初始化,因此是不确定的,再次导致错误

使用普通赋值,让编译器为您正确地进行转换:

sizeOfStr = size;
使用
memcpy(&sizeOfStr,&size,4)
我发现了两个问题

第一个是从一个单字节变量中复制四个字节,这是一个明确的定义

第二个是
sizeOfStr
可能是8个字节(在64位系统上,GCC的
long
通常是64位)。这将使部分变量未初始化,因此是不确定的,再次导致错误

使用普通赋值,让编译器为您正确地进行转换:

sizeOfStr = size;

您是否尝试在调试器中捕获崩溃,并查看函数调用堆栈以找出它在代码中发生的位置?这是在生产中发生的。我无法在那里使用调试器。segfault消息是我得到的唯一提示。我正在试图找出导致此情况的代码部分。addr2line已将我指向std::string:\S_复印件函数。我需要跟踪调用它的代码。并且没有内核转储可以用于调试生成?因为如果没有调用堆栈,就无法提升调用堆栈。不,我只是有一条segfault消息。顺便说一句,我用一些额外的信息更新了查询。我怀疑有一个函数可以做到这一点。这是一个4年前的代码。您是否尝试在调试器中捕获崩溃,并查看函数调用堆栈以找出它在代码中发生的位置?这是在生产中发生的。我无法在那里使用调试器。segfault消息是我得到的唯一提示。我正在尝试找出导致此情况的代码部分。addr2行已将我指向std::string::_S_copy_chars()函数。我需要跟踪调用它的代码。并且没有内核转储可以用于调试生成?因为如果没有调用堆栈,就无法提升调用堆栈。不,我只是有一条segfault消息。顺便说一句,我用一些额外的信息更新了查询。我怀疑有一个函数可以做到这一点。这是一个4年前的代码。这会导致当前的segfault情况吗?它是如何在这个生产服务器上运行这么多个月的?它从第一天起就不会影响吗?@Sharath它确实会导致像您这样的崩溃。而未定义行为的问题是,它可能会工作数年,然后有一天会如此mething似乎不相关的内容已更改,不再有效。谢谢,让我进行此更改,然后查看是否修复了崩溃。“sizeOfStr=size”不起作用。memcpy仍然是必需的。但我已将unsigned long更改为unsigned int。@Sharath“不起作用”是什么意思?即使您将
sizeOfStr
更改为
unsigned int
,您仍然有未定义的行为,因为您从一个字节源复制了四个字节。这会导致当前的SEGFULT情况吗?在这之前,它是如何在这个生产服务器上运行这么多个月的?它从第一天起不应该影响吗?@Sharath它确实会导致崩溃就像你所拥有的一样。未定义行为的问题是,它可能会工作多年,然后有一天,一些看似无关的东西发生了变化,它不再工作。谢谢,让我进行此更改,然后看看是否修复了崩溃。“sizeOfStr=size”不起作用。memcpy仍然是必需的。但是我将unsigned long更改为unsigned int。@Sharath“不起作用”是什么意思?即使将
sizeOfStr
更改为
unsigned int
,您仍然有未定义的行为,因为您从一个字节源复制了四个字节。