0

我有这个 C++ 应用程序在Ubuntu Lucid 10.04.3 LTS上运行,它崩溃了,原因真的让我无法理解。

显示失败的方法是这个:

void
IoLogikCommunicator::processPacket(char const* data, WORD wSize)
{
  std::string message(data, wSize);
  std::stringstream ss(message);
  std::string token;

  std::vector<std::string> tokens;
  while (std::getline(ss, token, '#'))  // <- crash
    tokens.push_back(token);

  if (tokens[0] == "SENSORS")
      processSensorsPacket(tokens);
  else if (tokens[0] == "SELECTOR")
      processSelectorPacket(tokens);
}

根据核心转储,data内容是有效的,它是:

p data
$1 = 0xb7520214 "SENSORS#192.168.107.62#DI:00#ON#DI:01#ON#DI:02#ON#DI:03#OFF#DI:04#OFF#DI:05#OFF"

p wSize
$2 = 79

的内容tokens,在崩溃时,是["SENSORS"],所以第一个元素被正确解析。

然后发生的是:

Program terminated with signal 6, Aborted.
#0  0x009de422 in __kernel_vsyscall ()
(gdb) bt
#0  0x009de422 in __kernel_vsyscall ()
#1  0x0766a651 in raise () from /lib/tls/i686/cmov/libc.so.6
#2  0x0766da82 in abort () from /lib/tls/i686/cmov/libc.so.6
#3  0x076a149d in ?? () from /lib/tls/i686/cmov/libc.so.6
#4  0x076ab591 in ?? () from /lib/tls/i686/cmov/libc.so.6
#5  0x076ae710 in ?? () from /lib/tls/i686/cmov/libc.so.6
#6  0x076aff9c in malloc () from /lib/tls/i686/cmov/libc.so.6
#7  0x0070dc07 in operator new(unsigned int) () from /usr/lib/libstdc++.so.6
#8  0x006e7d06 in std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) () from /usr/lib/libstdc++.so.6
#9  0x006e9f70 in std::string::_M_mutate(unsigned int, unsigned int, unsigned int) () from /usr/lib/libstdc++.so.6
#10 0x006c4274 in std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char) () from /usr/lib/libstdc++.so.6

鉴于SIGABRT似乎 assert() 在 malloc 调用中失败,但可能是什么原因?当然,我不可能重现该错误:此方法每秒调用多次,并且应用程序在连续运行 30 天或更长时间后崩溃。

然后,相同的数据由另一个相同的应用程序处理,该应用程序托管在另一台机器上:那个没有崩溃。

你有什么建议/提示/提示/指针吗?

4

0 回答 0