Sun[tm] Studio 9：dbx 自述文件
Description: Sun Studio 9 dbx 自述文件
Keywords: 自述, 文档, 出版,

2004 年 5 月 27 日更新

### Sun[tm] Studio 9：`dbx` 自述文件

> #### 目录

> 1. 简介
> 2. 关于 Sun Studio 9 `dbx`
> 3. 新特性和更改的特性
> 4. 软件更正
> 5. 问题和解决办法
> 6. 限制和不兼容
> 7. 文档错误

> #### 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` 中修复的问题。

> 1. `dbx` 无法打印优化 C++ 代码的注册内容或类成员
> 2. `bcheck` 不能正确报告所有错误
> 3. `dbx` 在对 sparcv9 代码进行运行时检查时发出错误消息 (Error 0)
> 4. `dbx` 终止它无法控制的进程
> 5. `stop inclass/inobject` 花费的时间比较长
> 6. 64 位：大型连续堆块上的访问检查失败
> 7. `dbx` 修复并继续导致 Pro/E 因为 `SIGILL` 而崩溃

> 1. ##### `dbx` 无法打印优化 C++ 代码的注册内容或类成员

>    在 Sun Studio 8 中修复。`dbx` 现在可以打印用 `-g -xO4` 编译的 C++ 代码的注册表（例如，`$o7`）和类成员（例如，`foo.x`）。

> 2. ##### `bcheck` 不能正确报告所有错误 (4460648)

>    对丢失的堆上的数据结构的出站指定现在被运行时检查所捕获。

> 3. ##### `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"

>    它已被修复。

> 4. ##### `dbx` 终止它无法控制的进程 (5022145)

>    当 `dbx` 需要更多的内存而无法分配它时（例如，系统交换空间不足），`dbx` 将终止正在调试的进程。这一特殊的问题已被修复。当 `dbx` 无法获取附加内存时，可能会出现其他奇怪情况。在调试期间要尽量避免达到系统极限。

> 5. ##### `stop inclass/inobject` 花费的时间比较长 (4952613)

>    在 Sun Studio 8 中修复。该性能问题已被修复。

> 6. ##### 64 位：大型连续堆块上的访问检查失败 (4958325)

>    `dbx` 过去使用 32 位值来存储堆块的大小。堆块的尺寸要比这个混淆的 `dbx` 大。它已被修复。

> 7. ##### `dbx` 修复并继续导致 Pro/E 因为 `SIGILL` 而崩溃 (4974233)

>    当 `dbx` 将替换函数的地址添加到运行的可执行文件中时，有时会让地址出错。它已被修复。

> #### E. 问题和解决办法

> 本节讨论了已知的软件问题及其可能的解决方法。有关更新信息，请查看开发人员门户，网址：`http://developers.sun.com/prodtech/cc/support_index.html`。

> 1. 当 `dbx` 连接到进程时发生数据收集问题
> 2. RTC 将复制填充结构视为错误
> 3. `dbx` 不检查来自拷贝构造函数的 RUI
> 4. `dbx` 在调试 Java 代码时可能会崩溃
> 5. `dbx` 在重新调试 Java 代码时崩溃

> 1. ##### 当 `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)`，基于时钟的分析实验将会被破坏，因为收集器和程序都在使用该计时器。

> 2. ##### 6. RTC 考虑复制填充的结构是一个问题 (4460536)

>    在启用运行时检查的情况下，如果复制数据字段之间存在间隙（漏洞或填充）的结构，`dbx` 报告 RUI（从未初始化的内存中读）错误。

> 3. ##### `dbx` 不检查来自拷贝构造函数的 RUI

> 运行检查可能会错误地报告内联 C++ 拷贝构造函数的 RUI（从未初始化内存读取）。

> 4. ##### `dbx` 在调试 Java 代码时可能崩溃 (4893079)

> 如果从 `dbx` shell 内部发布一条 `cd` 命令，或者设置 `CLASSPATH` 环境变量或 `CLASSPATHX` 环境变量，则 `dbx` 可能因段故障而崩溃。

> 解决办法：

> - 请勿执行上述任何操作。
> - 在执行上述任何操作前，删除所有监视（显示）。

> 5. ##### `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. 保留所有权利。必须依据许可证条款使用。