2004 年 5 月 27 日更新 |
Sun[tm] Studio 9:dbx 自述文件 |
目录
A. 简介
本文档包含 Sun[tm] Studio 9 dbx 的相关信息。本文档描述了此发行版本中包含的新增功能以及所做的软件更正,并列出了已知问题、限制和不兼容性。本文档中的信息优先于此发行版本各手册中的信息。
产品文档
- Solaris 平台的发行说明:可以通过 Sun Studio 9 网站 http://developers.sun.com/tools/cc/documentation/ss9_docs/release_notes.html 获得此发行说明。发行说明中的信息会更新和扩展所有自述文件中的信息。
- Linux 平台的发行说明:可以通过 Sun Studio 9 网站 http://developers.sun.com/tools/cc/documentation/ss9_docs/release_notes.html 获得此发行说明。发行说明中的信息会更新和扩展所有自述文件中的信息。
- Sun Studio 9 文档:产品手册页、自述文件的 HTML 版本以及手册可以从 /installation_directory/docs/index.html 进行访问。Solaris 平台上的缺省安装目录是 /opt/SUNWspro。Linux 平台上的缺省安装目录是 /opt/sun/sunstudio9。
- IDE 文档:Sun Studio 9 IDE 所有组件的联机帮助可从 IDE 中的 [帮助] 菜单进行访问。
- 开发人员资源门户:有关技术文章、代码样例、文档和知识库,请参见开发人员门户,网址:http://developers.sun.com/prodtech/cc。
B. 关于 Sun Studio 9 dbx
dbx 是一种交互式源码级命令行调试工具。可用它以可控方式运行程序和检查停止运行的程序的状态。dbx 让您能够完全控制程序的动态执行,包括性能数据的收集。此发行版的 dbx 在下列平台上可用:
- Solaris[tm] 操作系统:
- SPARC® Platform Edition,第 8、9 和 10 版
- x86 平台版本,第 8、9 和 10 版
Linux 操作系统:
- Sun[tm] Java Desktop System 2003
- SuSE Linux Enterprise Server 8
- RedHat Enterprise Linux 3
C. 新增功能和更改的功能
本节描述了 dbx 的新增功能及更改功能。
Sun Studio 9 dbx 中新增和更改了以下功能。
- 在 Linux 平台上支持 gcc 和 g++ 编译器
- 支持 Solaris OS、x86 Platform Edition 上的 Fortran
dbx 的新功能不适用于使用 gcc 或 g++ 编译器编译的程序,或在 Linux 平台上运行的程序。有关详细信息,请参见限制和不兼容性。
有关 Solaris 平台上其他 Sun Studio 9 组件的信息,参见《新增功能》手册,网址为 http://docs.sun.com。
D. 软件更正
本节描述了在 Sun Studio 9 发行版本的 dbx 中修复的问题。
- dbx 无法打印优化 C++ 代码的注册内容或类成员
- bcheck 不能正确报告所有错误
- dbx 在对 sparcv9 代码进行运行时检查时发出错误消息 (Error 0)
- dbx 终止它无法控制的进程
- stop inclass/inobject 花费的时间比较长
- 64 位:大型连续堆块上的访问检查失败
- dbx 修复并继续导致 Pro/E 因为 SIGILL 而崩溃
dbx 无法打印优化 C++ 代码的注册内容或类成员
在 Sun Studio 8 中修复。dbx 现在可以打印用 -g -xO4 编译的 C++ 代码的注册表(例如,$o7)和类成员(例如,foo.x)。
bcheck 不能正确报告所有错误 (4460648)
对丢失的堆上的数据结构的出站指定现在被运行时检查所捕获。
dbx 在对 sparcv9 代码进行运行时检查时发出错误消息 (4975411)
在 Sun Studio 8 中修复。在启用访问检查的情况下在 dbx 下执行 64 位 SPARC 程序有时会导致 dbx 发出错误消息,比如:
dbx:read of 4 bytes at address 0x8 failed --- Error 0 dbx warning:internal handler (-396) made defunct --- could not enable event FRET"它已被修复。
dbx 终止它无法控制的进程 (5022145)
当 dbx 需要更多的内存而无法分配它时(例如,系统交换空间不足),dbx 将终止正在调试的进程。这一特殊的问题已被修复。当 dbx 无法获取附加内存时,可能会出现其他奇怪情况。在调试期间要尽量避免达到系统极限。
stop inclass/inobject 花费的时间比较长 (4952613)
在 Sun Studio 8 中修复。该性能问题已被修复。
64 位:大型连续堆块上的访问检查失败 (4958325)
dbx 过去使用 32 位值来存储堆块的大小。堆块的尺寸要比这个混淆的 dbx 大。它已被修复。
dbx 修复并继续导致 Pro/E 因为 SIGILL 而崩溃 (4974233)
当 dbx 将替换函数的地址添加到运行的可执行文件中时,有时会让地址出错。它已被修复。
E. 问题和解决办法
本节讨论了已知的软件问题及其可能的解决方法。有关更新信息,请查看开发人员门户,网址:http://developers.sun.com/prodtech/cc/support_index.html。
- 当 dbx 连接到进程时发生数据收集问题
- RTC 将复制填充结构视为错误
- dbx 不检查来自拷贝构造函数的 RUI
- dbx 在调试 Java 代码时可能会崩溃
- dbx 在重新调试 Java 代码时崩溃
当 dbx 连接到进程时发生数据收集问题
如果将 dbx 连接到一个正在运行的进程而没有预装收集器库 libcollector.so,可能会发生多种错误。
- 无法收集任何跟踪数据:同步等待跟踪、堆跟踪或 MPI 跟踪。跟踪数据是通过对各个库进行插入操作而收集的。如果未预加载 libcollector.so,则无法执行插入操作。
- 如果程序在 dbx 连接到进程后安装信号处理程序,并且该信号处理程序不传递 SIGPROF 和 SIGEMT 信号,分析数据和抽样数据将丢失。
- 如果程序使用异步 I/O 库 libaio.so,基于时钟的分析数据和抽样数据将丢失,因为 libaio.so 会使用 SIGPROF 执行异步取消操作。 (4397578)
- 如果程序使用硬件计数器库 libcpc.so,则硬件计数器上溢分析实验将会被破坏,因为收集器和程序都在使用该库。如果硬件计数器库是在 dbx 连接到进程之后装入的,硬件计数器实验则可成功(只要对 libcpclibrary 函数的引用通过广义搜索而不是 libcpc.so 中的搜索来解析)。
- 如果程序调用 setitimer(2),基于时钟的分析实验将会被破坏,因为收集器和程序都在使用该计时器。
6. RTC 考虑复制填充的结构是一个问题 (4460536)
在启用运行时检查的情况下,如果复制数据字段之间存在间隙(漏洞或填充)的结构,dbx 报告 RUI(从未初始化的内存中读)错误。
dbx 不检查来自拷贝构造函数的 RUI
运行检查可能会错误地报告内联 C++ 拷贝构造函数的 RUI(从未初始化内存读取)。
dbx 在调试 Java 代码时可能崩溃 (4893079)
如果从 dbx shell 内部发布一条 cd 命令,或者设置 CLASSPATH 环境变量或 CLASSPATHX 环境变量,则 dbx 可能因段故障而崩溃。
解决办法:
- 请勿执行上述任何操作。
- 在执行上述任何操作前,删除所有监视(显示)。
dbx 在重新调试 Java 代码时崩溃 (4801883)
在 Java 代码的一行内发布两条 debug 命令可能导致 dbx 崩溃。
F. 限制和不兼容
Sun Studio 9 dbx 具有以下限制:
- dbx 的以下功能不适用于 Linux 平台:
- 主存文件调试
- 修复并继续
- Java 调试
- 运行时检查
- 性能数据收集
- 下列事件上的断点:
- fault
- lastrites
- lwp_exit
- sysin
- sysout
- sync
- throw
- dbx 无法 exec() 被调用时在 Linux 平台上执行叉形进程,或更改为新的程序。
- Korn shell 中的 pipe 运算符仅限于 Linux 平台。任何需要访问目标进程的 dbx 命令都不作为管道的一部分运行。例如,下面的命令可能会导致 dbx 挂起:
where | head -1解决办法:
- 键入 Ctrl-C 以显示新的 dbx 提示符。
- dbx 会缓存大量信息,比如对于上例,下面的命令序列起作用:
where where | head -1在 Linux 平台上调试程序时可能会发生下面的问题:
- 如果程序使用 clone() 实现自身的线程样式,则 dbx 中的线程支持不能正确识别线程。
解决办法:
使用 libthread.so 代替 clone()。- Linux OS 中的线程库使用 SIGSTOP 信号作为其内部机制的一部分。通常,dbx 会对您隐藏这些信号,并允许您从其他源监视真正的 SIGSTOP 信号。偶尔,Linux OS 会以意想不到的方式使用 SIGSTOP,dbx 将系统生成的 SIGSTOP 解释为用户生成的 SIGSTOP。
解决办法:
使用 ignore 命令以告知 dbx 不要捕获 SIGSTOP 信号。有时线程退出,但 Linux OS 不将退出报告给 dbx。当使用新的线程库时,这种情况发生的次数会减少 (NPTL)。
当线程退出并且退出未报告时,dbx 会等待永远也不发生的事件并且不显示新的提示符。这种情况最可能在您在 dbx 中指定完 cont 命令后发生,但它也可能在 step up 命令、step 命令、next 命令和其他命令后发生。
解决办法:
- 有时,键入 Ctrl-C 会导致 dbx 停止等待并显示新的提示符。
- 如果 Ctrl-C 不起作用,就请退出 dbx 并重新启动它。
- C++ 表达式的运行时类型信息不适用于使用 g++ 编译器编译的程序。
- 运行时检查的内存访问检查功能不适用于 Solaris OS x86 Platform Edition。
- 不能从 .dbxrc 文件连接到正在运行的进程。.dbxrc 文件不应含有执行代码的命令。但是,您可以将此类命令放在一个文件中,然后使用 dbx source 命令来执行该文件中的命令。
- dbx 无法正确地将损坏的指针指向 compat=4 的成员函数。对于 compat=5 而言并不存在这一问题。
解决办法:按如下方法重新编译程序:
CC -compat=4 -Qoption ccfe -abiopt=pmfun1该标记引入了 ABI 更改并且不应该在产品生成中使用。
- 在 V9/V9 系统中,如果参数不是整型,则通过利用 -g 和 -O 选项编译的代码传递的栈跟踪所提供的结果不准确。打印此类函数中的浮点参数会显示以下错误消息:
RegSet::getd('o1'):cannot -- will return 0.0解决办法:仅使用 -g。
- 在 V9/V9 系统中,使用 call 命令或打印函数调用对作为参数或返回值的嵌套小结构不起作用。
- 使用 libC.so.5 或者 libC.so.4 的较早副本可能会引起在 C++ 异常区域中的 dbx 问题。可能导致关于错误的 stab 和未处理的异常的警告消息。
解决办法:在所有的系统上安装最新的 libC.so.5。
libC.so.5 作为 SUNWlibC 补丁程序(Solaris 操作环境的每个版本和每种体系结构都提供了一个此类程序),可以从 Sun Studio 9 下载或从 http://sunsolve.sun.com 上获取。 有关您的 Solaris 操作系统版本和系统体系结构对应的补丁程序编号的信息,请参见《Sun Studio 9 for Solaris 平台发行说明》,该说明位于产品网站 http://developers.sun.com/tools/cc/documentation/ss9_docs/release_notes.html。
- Fortran 用户应该用 -stackvar 选项编译,以便充分利用运行时检查。
某些程序可能无法正常使用 -stackvar。在这种情况下,尝试使用 -C 编译器选项,它可以在不使用 RTC 的情况下打开数组下标检查。
- 对于多线程的应用程序,跟踪派生可能不可信。
- 使用 call 命令或打印函数调用可能会导致多线程应用程序发生死锁。
- 如果文件是预编译头文件 (PCH) 集合的一部分,请不要使用 dbx 的修复并继续功能来更改头文件。
- dbx 命令行解释器是较早版本的 Korn shell (ksh),不支持代码集独立 (CSI)。当在 dbx 命令行上键入多字节字符时,会发生解释错误。
G. 文档错误
目前没有新的信息。
版权所有 © 2004 Sun Microsystems, Inc. 保留所有权利。必须依据许可证条款使用。