Oracle® Developer Studio 12.5:使用 dbx 调试程序

退出打印视图

更新时间: 2016 年 6 月
 
 

修改程序状态

本附录重点说明 dbx 的使用方法以及在 dbx 下运行程序时更改程序或更改程序行为的命令,并与不使用 dbx 运行程序进行了比较。了解哪些命令可能修改程序是很有必要的。

dbx 下运行程序的影响

可以使用 dbx 观察进程,并且不会对进程造成影响。但有时可能会彻底修改进程的状态。有时,普通的观察可能会影响执行,并导致出现间歇性错误症状。

dbx 下运行时,应用程序的行为方式可能会不同。尽管 dbx 尽量减小它对所调试的程序的影响,但您还是应该注意以下问题:

  • 您可能忘记去掉 –C 或禁用 RTC。将 RTC 支持库 librtc.so 装入程序可能会导致程序的行为方式不同。

  • dbx 初始化脚本中可能设置了一些您已忘记的环境变量。在 dbx 下运行时,堆栈基址从不同的地址开始。该地址也可能因环境及 argv[] 内容的不同而异,从而强制局部变量以不同方式分配。如果变量未初始化,则将生成不同的随机编号。可以使用运行时检查来检测此问题。

  • 程序不会在使用前对通过 malloc() 分配的内存进行初始化。可以使用运行时检查来检测此问题。

  • dbx 必须捕捉 LWP 创建和 dlopen 事件,这可能会影响与计时有关的多线程应用程序。

  • dbx 会在收到信号时执行上下文切换,因此,如果应用程序大量使用信号,则系统工作情况可能会有所不同。

  • 程序可能期望 mmap() 始终为映射的段返回相同的基址。在 dbx 下运行会严重影响地址空间,致使 mmap() 返回的地址不可能与在不使用 dbx 运行该程序时所返回的地址相同。要确定这是否构成问题,请查看 mmap() 的所有使用情况,确保返回的地址是程序使用的地址,而非固定编码地址。

  • 如果程序是多线程程序,则它可能包含数据争用或以其他方式依赖线程调度。在 dbx 下运行会干扰线程调度,并可能导致程序以异常顺序执行线程。要检测此类情况,请使用 lock_lint

否则,请确定使用 adbtruss 运行是否会导致相同的问题。

要尽可能减小 dbx 带来的干扰,请尝试当应用程序在其自然环境中运行时与其连接。