我正在尝试使用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的新手。我使用此link
进行了一些调试当我尝试在此方法中打印变量时
> 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中调试的任何提示?
答案 0 :(得分:0)
当mdb将msg打印为 libc.so.1`msg 时,表明它在libc中找到了一个值,而不是在你的代码中。同样,它显示了 libenv.so`history_size ,因此在libenv中找到了一个类似命名的条目。 mdb不会知道函数参数的名称。
如果使用调试信息(编译器-g
标志)构建二进制文件并使用编译器的源代码级调试器(gdb,如果使用gcc,dbx if,则会更容易)您正在使用Sun Studio或Solaris Studio编译器。