Solaris C++程序崩溃.有关 mdb 调试的帮助



我正在尝试在 solaris 中使用 mdb 调试分段错误(因为这对我来说是唯一可用的选项)。以下是核心转储

`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 中进行调试的任何提示?

当 mdb 将 msg 打印为 libc.so.1'msg 时,它表明它在 libc 中找到了一个值,而不是在你的代码中找到了一个值。 同样,它显示libenv.so'history_size所以在libenv中找到了一个类似名称的条目。MDB 不会知道函数的参数名称。

如果您使用调试信息(编译器的-g标志)构建二进制文件,并为编译器使用源代码级调试器(如果使用 gcc,则为 gdb,如果使用 Sun Studio 或 Solaris Studio 编译器,则为 dbx),

则使用,则可以轻松得多。

最新更新