可以使用 dbx 观察进程,并且不会对进程造成影响。但有时可能会彻底修改进程的状态。而且有时,普通的观察可能会影响执行,导致出现错误症状而失去控制。
在 dbx 下运行时,应用程序的行为方式可能会不同。尽管 dbx 尽量减小它对所调试的程序的影响,但您还是应该注意以下问题:
您可能忘记去掉 -C 或禁用 RTC。将 RTC 支持库 librtc.so 装入程序可能导致程序的行为方式不同。
dbx 初始化脚本可能含有一些您已经忘记的环境变量集。在 dbx 下运行时,栈基址从不同的地址开始。它视环境及 argv[] 的内容的不同而异,从而强制局部变量以不同方式分配。如果它们未初始化,则将获得不同的随机数字。可以使用运行时检查来检测此问题。
程序不对使用之前用 malloc()() 分配的内存进行初始化,与前者的情况类似。可以使用运行时检查来检测此问题。
dbx 必须捕捉 LWP 创建和 dlopen 事件,这可能会影响与计时有关的多线程应用程序。
dbx 会在收到信号时执行上下文切换,因此,如果应用程序大量使用信号,则系统工作情况可能会有所不同。
程序可能期望 mmap()() 总是为已映射的段返回相同的基址。在 dbx 下运行会严重影响地址空间,以致 mmap()() 所返回的地址不大可能与不使用 dbx 运行该程序时所返回的地址相同。要确定这是否会成为问题,请查看 mmap() 的所有使用情况,确保返回的地址为程序所使用,而非固定编码地址。
如果程序是多线程程序,则它可能包含数据争用或以其他方式依赖线程调度。在 dbx 下运行会干扰线程调度,并可能导致程序以异常顺序执行线程。要检测此类情况,请使用 lock_lint。
否则,请确定使用 adb 或 truss 运行是否会导致相同的问题。
要尽可能减小 dbx 带来的干扰,请尝试当应用程序在其自然环境中运行时与其连接。