Странный сбой приложения

У меня есть это приложение 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 и более дней непрерывной работы.

Таким образом, те же самые данные обрабатываются другим идентичным приложением, которое размещено на другом компьютере: это не было сбоя.

Есть ли у вас какие-либо предложения / подсказки / советы / указатель?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]