在 Solaris 上找到错误的内存访问

Posted

技术标签:

【中文标题】在 Solaris 上找到错误的内存访问【英文标题】:Locate bad memory access on Solaris 【发布时间】:2009-12-10 14:29:15 【问题描述】:

在 Linux、FreeBSD 和其他系统上,我使用 valgrind 来检查内存错误,例如无效读取和类似情况。我真的很喜欢 valgrind。现在我必须在 Solaris/OpenSolaris 上测试代码,但找不到一种方法来以与 valgrind 一样好的方式(或更好;-))获取有关无效读/写的信息。

在网上搜索此内容时,我找到了对libumem 的引用,但我只收到有关那里内存泄漏的报告,而不是无效访问。我错过了什么?

【问题讨论】:

【参考方案1】:

Sun Studio 编译器附带的 dbx 在其“运行时检查”功能(check 子命令)中包含内存访问检查支持。见:

Solaris Studio 12.4 dbx manual: Chapter 9: Using Runtime Checking Debugging Applications with Sun Studio dbx, dbxtool, and the Thread Analyzer Leonard Li's Weblog: Runtime Memory Checking

相关的“Sun Memory Error Discovery Tool”也可以从 http://cooltools.sunsource.net/discover/

【讨论】:

嗯,我去过那里却忘记了它......现在正在使用 bcheck 包装器并试图将它放入我的自动化测试套件中。 现在还有一个experimental/partial port of valgrind to Solaris 是一个学生制作的,作为他们master thesis project 的一部分。【参考方案2】:

从 3.11.0 版开始,Valgrind 可以在 Solaris 上运行。 请参阅Release Notes 和Supported Platforms。

更准确地说,现在支持 x86/Solarisamd64/Solaris。 对 sparc/Solaris 的支持仍在进行中。

【讨论】:

顺便提一下,你必须至少有 Solaris 11。特别是不支持 Solaris 10.X。【参考方案3】:

watchmalloc 是一个非常有用的库,可以为您的程序动态加载(通常不需要重新编译),然后在所有通常有问题的内存位置设置观察点,例如释放区域或分配的内存块之后。 如果您的程序访问这些无效区域之一,它会收到一个信号,您可以在调试器中对其进行检查。

根据配置,有问题的区域可以只观察写入,也可以观察读取。

【讨论】:

以上是关于在 Solaris 上找到错误的内存访问的主要内容,如果未能解决你的问题,请参考以下文章

在 Solaris 中查找进程的物理内存详细信息的命令

遇到 CUDA 非法内存访问

shmget 如何分配内存?无法使用线性寻址访问(地址边界错误)

如何捕获未对齐的内存访问?

Solaris 10 操作系统上的 Oracle 11g 数据库块大小

在Linux上利用core dump和GDB调试