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

退出打印视图

更新时间: 2016 年 6 月
 
 

事件安全

尽管 dbx 向您提供了通过事件机制实现的一组丰富的断点类型,但它还会在内部使用许多事件。通过在发生其中一些内部事件时停止,可以很容易地中止 dbx 的内部操作。如果在这些情况下修改进程状态,中止的可能性会更高。请参见修改程序状态调用安全性

dbx 可以保护自身在某些情况下(但不是所有情况下)中止操作。一些事件按照低级别事件来实现。例如,所有步进操作都是基于 fault FLTTRACE 事件。因此,发出 stop fault FLTTRACE 命令会中止步进操作。

在以下调试阶段,dbx 不能处理用户事件,因为这些事件会干扰某些需要非常谨慎的内部协调操作。这些阶段包括:

  • 程序启动时rtld 运行阶段(请参见动态链接程序

  • 进程开始和结束阶段

  • 跟随 fork() 函数和 exec() 函数(请参见跟随 fork 函数跟随 exec 函数

  • dbx 需要在用户进程中初始化头文件 (proc_heap_init()) 的调用期间

  • dbx 需要确保堆栈上映射页的可用性 (ensure_stack_memory()) 的调用期间

在许多情况下,可以使用 when 命令而非 stop 命令,以及回显以其他方式交互获得的信息。

    dbx 通过以下方式保护自身:

  • 禁止对 syncsyncrtldprog_new 事件使用 stop 命令

  • rtld 握手期间和上面提到的其他阶段中,忽略 stop 命令

例如:

...SolBook linebreakstopped in munmap at 0xff3d503c 0xff3d503c: munmap+0x0004: ta %icc,0x00000008SolBook linebreak dbx76: warning: 'stop' ignored -- while doing rtld handshake

仅忽略中断影响(其中包括 $firedhandlers 变量中的记录)。计数器或过滤器仍发挥作用。要在这种情况下停止,请将环境变量 event_safety 设置为 off