【问题标题】:How to detect the object with memory alloc/free error?如何检测内存分配/释放错误的对象?
【发布时间】:2018-07-09 05:31:09
【问题描述】:

Mac OS X。 我运行一个应用程序,它加载一个 odbc 驱动程序。我在 system.log 中看到消息:

malloc: *** 对象错误,释放对象的校验和不正确 - 对象ххх可能在被释放后被修改了

另外,我有这个驱动的c++源代码,但是没有看到malloc/free的问题在哪里。

如何检测和定位对象 xxx 是什么?

【问题讨论】:

  • 首先对您的自己的代码进行代码审查。你有指针吗?你有数组吗?你有向量吗?你有动态分配的“数组”吗?如果这些问题中任何的答案都是“是”,那么请检查您如何使用指针、数组、向量等。很有可能您超出了动态分配内存的范围。
  • 作为第二种选择,使用诸如Valgrind 之类的工具来调试内存分配和写入。如果您使用调试信息构建应用程序,那么 Valgrind 可以向您显示您越界或使用内存和指针做其他坏事的确切文件和行。
  • 第三个选项,启用大量警告的构建。这应该是真正的第一个选项,第三个是静态分析工具(也称为linter)来分析你的代码。 Linters 比编译器更擅长查找麻烦的代码。
  • 另外,请注意您的术语:“本地化”与您想要做的“定位”有很大不同。
  • 我的 odbc 驱动程序实际上是 PostgreSQL odbc 驱动程序 v9

标签: c++ macos odbc


【解决方案1】:

macOS / OS X 有一个叫做 Guard Malloc 的东西,它包含许多用于检测此类问题的机制(可能是内存覆盖或释放后写入)失败。

要使用它,您只需在启动应用之前设置一些环境变量,并确保您在运行时加载了libgmalloc.dylib,例如:

DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib MallocGuardEdges=1 myprog

MallocGuardEdges 被记录为:

如果设置,malloc 在大分配之前和之后添加保护页。

文档也有这样的说法(我依稀记得必须这样做一次):

要使用 Guard Malloc 进行调试,请将您的项目配置为在 Xcode 方案编辑器中使用 Guard Malloc 运行。

这样可以避免使用DYLD_INSERT_LIBRARIES 技巧。

详细信息here

【讨论】:

  • 谢谢!我已经运行了该应用程序,它创建了日志文件。但是当我打开它时,我看到了信息但无法解释它。如何理解日志文件?有什么工具?
  • 我真的不知道,我的代码永远不会崩溃 :) 你能在启用 Guard Malloc 的 Xcode 中调试你的应用程序吗?然后,您就有机会在故障点发现问题。该链接背后的更多详细信息。
  • 我运行 Java 应用程序,它分叉了加载 odbc 驱动程序(c++ *.so 文件)的其他 (c++) 进程。它有双重释放同一对象的问题。我需要赶上大约。免费通话不正确的地方..
  • 这听起来是一个非常棘手的问题。这些软件是谁提供的,您可以向他们寻求帮助吗?
  • 不,我不能,这个 odbc 驱动程序是我的代码(它是修改过的 postgresql odbc),但 app-caller 不是。我确信应用程序崩溃是因为 odbc 驱动程序有不正确的 malloc/free 调用
猜你喜欢
  • 2017-03-22
  • 2021-11-25
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 2011-11-21
相关资源
最近更新 更多