【问题标题】:How to fix memory access error如何修复内存访问错误
【发布时间】:2008-12-22 23:40:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ memory solaris


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      下面这行我觉得不对

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

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

      stringstream ss;
      ss << ":BIND" << ns;
      string sLabel = ss.str();
      

      【讨论】:

      • ":BIND"+ns 表示 ":BIND" 开头之后的 "ns" 个字节。当 ns > 6 时,这会让你进入拉拉之地。不过,不确定 ns > 2。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我在 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多