我正在做一个迁移项目,在这里我们正在将大量 C++ 库从 Mainframe 迁移到 Solaris。我们已成功完成迁移,但在运行应用程序时,某些地方会因“信号 SEGV(故障地址无映射)”而崩溃。
由于该应用程序也支持 Windows,因此我们在 Windows 上检查了 purify。应用程序中没有内存泄漏,并且在 Windows 上运行良好。
任何人都可以建议,可能导致此类错误的其他原因是什么。有什么工具可以追踪这类错误吗?
这不一定是内存泄漏。可能是在释放后引用了一块内存。
我的朋友曾经带着一段在 Windows 上运行良好但在 Linux 上提供 segv 的代码来找我。事实证明,有时内存在 Windows 上释放后仍然有效(可能在短时间内),但在 Linux 上立即触发了 segv。
下面的行对我来说看起来不对
m_BindMap[sLabel] = b; // crashes at this line at when map size
我假设您正在尝试在字符串末尾添加一个数字。试试这个
stringstream ss;
ss << ":BIND" << ns;
string sLabel = ss.str();
你用的是g++吗?如果是这样,请使用“-g”标志重新编译。在 gdb 中运行程序。当它崩溃时输入“bt”(用于回溯),这应该告诉你问题出在哪里。
我在 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;