我正在开发一个迁移项目,这里我们正在将大量的C ++库从Mainframe迁移到Solaris。我们已成功完成迁移,但在运行应用程序时,有些地方会因“信号SEGV(故障地址没有映射)”而崩溃。
由于应用程序也支持Windows,我们在windows上检查了purify。应用程序中没有内存泄漏,它在Windows上运行正常。
任何人都可以建议,可能造成此类错误的其他原因是什么。用于跟踪此类错误的任何工具?
答案 0 :(得分:1)
这不一定是内存泄漏。可能是在它被释放后,引用了一块内存。
我的朋友曾经带着一段在Windows上正常运行但在Linux上运行segv的代码来找我。事实证明,有时你在Windows上释放它(可能是很短的一段时间)之后内存仍然有效,但是在Linux上立即触发了segv。
答案 1 :(得分:1)
下面这行看起来不对我
m_BindMap[sLabel] = b; // crashes at this line at when map size
我假设您正在尝试在字符串末尾添加一个数字。试试这个
stringstream ss;
ss << ":BIND" << ns;
string sLabel = ss.str();
答案 2 :(得分:0)
你在使用g ++吗?如果是这样,请使用“-g”标志重新编译。在gdb中运行该程序。当它崩溃时键入“bt”(用于回溯),那应该告诉你问题在哪里。
答案 3 :(得分:0)
我在solaris和dbx调试器上使用CC编译器。我知道它崩溃的调用堆栈。但这是一次惨淡的崩溃。
map<string,CDBBindParam,less<string> >m_BindMap;
CNumString ns(CNumStringTraits(0,2,'0'));
ns = m_BindMap.size();
string sLabel = ":BIND"+ns;
CDBBindParam b(sLabel,val);
**m_BindMap[sLabel] = b;** // crashes at this line at when map size is more than 2
return sLabel;