0

我正在做一个迁移项目,在这里我们正在将大量 C++ 库从 Mainframe 迁移到 Solaris。我们已成功完成迁移,但在运行应用程序时,某些地方会因“信号 SEGV(故障地址无映射)”而崩溃。

由于该应用程序也支持 Windows,因此我们在 Windows 上检查了 purify。应用程序中没有内存泄漏,并且在 Windows 上运行良好。

任何人都可以建议,可能导致此类错误的其他原因是什么。有什么工具可以追踪这类错误吗?

4

4 回答 4

1

这不一定是内存泄漏。可能是在释放引用了一块内存。

我的朋友曾经带着一段在 Windows 上运行良好但在 Linux 上提供 segv 的代码来找我。事实证明,有时内存在 Windows 上释放后仍然有效(可能在短时间内),但在 Linux 上立即触发了 segv。

于 2008-12-22T14:06:08.270 回答
1

下面的行对我来说看起来不对

m_BindMap[sLabel] = b;   // crashes at this line at when map size

我假设您正在尝试在字符串末尾添加一个数字。试试这个

stringstream ss;
ss << ":BIND" << ns;
string sLabel = ss.str();
于 2008-12-22T15:40:20.797 回答
0

你用的是g++吗?如果是这样,请使用“-g”标志重新编译。在 gdb 中运行程序。当它崩溃时输入“bt”(用于回溯),这应该告诉你问题出在哪里。

于 2008-12-22T14:03:53.503 回答
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;
于 2008-12-22T14:09:17.157 回答