Oracle Solaris Studio 12.2 dbx 有以下限制:
在基于 x86 系统的 Linux 操作系统上,无法使用 dbx 的以下功能:
在基于 x64 系统的 Linux 操作系统上,无法使用 dbx 的以下功能:
Java 调试
调试 32 位程序(除非使用 -x exec32 选项启动 dbx)。
当调用 exec() 时,dbx 无法在 Linux 平台上跟踪派生进程,或对新程序执行更改。
Korn shell 中的管道操作符仅限于 Linux 平台。任何需要访问目标进程的 dbx 命令不能作为管道的一部分使用。例如,下面的命令可能会导致 dbx 挂起:
where | head —1
解决方法:
键入 Ctrl-C 组合键以显示新的 dbx 提示符。
dbx 将缓存大量信息,因此,对于上面的示例,您可以使用下面的命令序列:
where where | head —1 |
在 Linux 平台上调试程序时可能会发生下面的问题:
如果程序使用 clone() 实现自己样式的线程,则 dbx 中提供的线程支持不能正确识别这些线程。
解决方法:
使用 libthread.so 而不是 clone()。
Linux 操作系统中的线程库使用 SIGSTOP 信号作为其内部机制的一部分。通常,dbx 会对您隐藏这些信号,并允许您通过其他源监视真正的 SIGSTOP 信号。偶尔,Linux 操作系统会以意想不到的方式使用 SIGSTOP,dbx 将系统生成的 SIGSTOP 解释为用户生成的 SIGSTOP。
解决方法:
使用 ignore 命令告知 dbx 不要捕获 SIGSTOP 信号。
有时线程退出,但 Linux 操作系统并不将退出行为报告给 dbx。当使用新的线程库 (NPTL) 时,这种情况发生的次数会减少。
当线程退出,但是未报告此退出操作时,dbx 会等待永远不发生的事件并且不显示新的提示符。这种情况最可能发生在您在 dbx 中提供了 cont 命令之后,但它也可能发生在 step up 命令、step 命令、next 命令和其他命令之后。
解决方法:
有时,键入 Ctrl+C 组合键会导致 dbx 停止等待并显示新的提示符。
如果 Ctrl+C 组合键不起作用,请退出 dbx 并重新启动。
C++ 表达式的运行时类型信息不适用于 g++ 编译器编译的程序。
不能从 .dbxrc 文件连接至正在运行的进程。.dbxrc 文件不应含有执行代码的命令。但是,您可以将此类命令放在一个文件中,然后使用 dbx source 命令来执行该文件中的命令。
dbx 无法正确地还原指向 compat=4 的成员函数的指针。如果使用 compat=5,则不会出现此问题。
解决方法:按如下方法重新编译程序:
CC —compat=4 —Qoption ccfe —abiopt=pmfun1
该标志引入了 ABI 更改并且不应该在产品生成中使用。
在 SPARC V9 (-m64) 系统中,使用 call 命令或输出函数调用对作为参数或返回值的嵌套小结构不起作用。
使用 libC.so.5 或者 libC.so.4 的旧副本可能会在 C++ 异常区域中引起 dbx 问题。可能会出现关于错误的 stab 和未处理的异常等警告消息。
解决方法:在所有系统上安装最新的 libC.so.5。
Fortran 用户应该用 -stackvar 选项进行编译,以便充分利用运行时检查。
某些程序可能无法正常使用 -stackvar。在这种情况下,请尝试使用 -C 编译器选项,它将在不使用运行时检查的情况下启用数组下标检查。
对于多线程的应用程序,跟踪派生可能不可靠。
使用调用命令或输出函数调用可能会导致多线程应用程序发生死锁。
如果文件是预编译的头文件 (Pre-Compiled Header, PCH) 集合的一部分,请不要使用 dbx 的修复并继续功能来更改头文件。
dbx 命令行解释器是旧版本的 Korn shell (ksh),不支持代码集独立 (Code Set Independence, CSI)。当在 dbx 命令行上键入多字节字符时,会发生解释错误。