Сбой программы Solaris C ++. Помощь по отладке mdb

0

Я пытаюсь отладить ошибку сегментации, используя mdb в solaris (поскольку это единственный доступный вариант для меня). Ниже приводится основная дампа

'threading model: multi-threaded
status: process terminated by SIGSEGV (Segmentation Fault)
C++ symbol demangling enabled
librax.so void RajHistory_Backend::addMessage+0x58()
librax.sovoid RajErrorSink::output+0xe0() 
librax.so void RajErrorSink_bg::DoWrite+9() 
librax.so int RajErrorSink_Backend::run+0x128()
libmtcpp.so void*startThread+0x1e()
libc.so.1 _thr_setup+0x5b()
libc.so.1 _lwp_start()'

Фрагмент кода

//
    std::deque<char*> _queue;

//
    void RajHistory_Backend::addMessage(char *msg)
    {
      _mutex.lock();
      _queue.push_front(msg);

      while ( _queue.size()-1 > _size )
      {
        char *b = _queue.back();
        _queue.pop_back();
        delete [] b;
      }
      _mutex.unlock();
    }

Я действительно пытаюсь найти причину сбоя, поскольку я новичок в mdb. Я сделал некоторую отладку, используя эту ссылку

Когда я попытался напечатать переменные в этом методе

> history_size/d
 libenv.so'history_size:
 libenv.so'history_size:         20

>msg/C
libc.so.1'msg:
libc.so.1'msg:  H

>msg/s
libc.so.1'msg:
libc.so.1'msg:  HGHcöHc°HÐÃUHåLeàLmèIüLuðH]ØAõL}øHì0
öIÖ|u5M
ötA>'

Означает ли это, что принятое сообщение, char* msg недействительно? Как получить точную строку в методе addMessage(), которая вызвала проблему? Любые намеки на это, как я могу отлаживать в mdb?

  • 1
    Пора начать использовать std::string и отбросить char * .
  • 0
    Вы гарантировали, что все, что вы помещаете в очередь, было выделено с помощью new [] и принадлежит этой очереди?
Показать ещё 1 комментарий
Теги:
debugging
segmentation-fault
solaris

1 ответ

0

Когда mdb печатает msg как libc.so.1'msg, он указывает, что он нашел значение в libc, а не в вашем коде. Аналогично, его показ libenv.so'history_size так нашел аналогичную запись в libenv. mdb не будет знать имена аргументов для ваших функций.

У вас будет намного легче, если вы -g свои двоичные файлы с информацией об отладке (флаг -g для компилятора) и используйте отладчик исходного уровня для вашего компилятора (gdb, если вы используете gcc, dbx, если вы используете Sun Studio или компиляторы Solaris Studio).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню