尽管 dbx 向您提供了通过事件机制实现的一组丰富的断点类型,但它还会在内部使用许多事件。通过在发生其中一些内部事件时停止,可以很容易地中止 dbx 的内部操作。如果在这些情况下修改进程状态,中止的可能性会更高。请参见附录 A和调用安全性。
dbx 可以保护自身在某些情况下(但不是所有情况下)中止操作。一些事件按照低级别事件来实现。例如,所有步进操作都是基于 fault FLTTRACE 事件。因此,发出 stop fault FLTTRACE 命令会中止步进操作。
在以下调试阶段,dbx 不能处理用户事件,因为这些事件会干扰某些需要非常谨慎的内部协调操作。这些阶段包括:
程序启动时rtld 运行阶段(请参见动态链接程序)
进程开始和结束阶段
执行 fork() 函数和 exec() 函数(请参见跟随 fork 函数和跟随 exec 函数)之后
dbx 需要在用户进程中初始化头文件 (proc_heap_init()) 的调用期间
dbx 需要确保栈上映射页的可用性 (ensure_stack_memory()) 的调用期间
在许多情况下,可以使用 when 命令而非 stop 命令,以及回显以其他方式交互获得的信息。
dbx 通过以下方式保护自身:
禁止在发生 sync、syncrtld 以及 prog_new 事件时执行 stop 命令。
忽略在 rtld 握手期间以及上述其他阶段执行的 stop 命令
例如:...stopped in munmap at 0xff3d503c 0xff3d503c: munmap+0x0004: ta %icc,0x00000008 dbx76: warning: 'stop' ignored -- while doing rtld handshake
仅忽略中断作用(包括 $firedhandlers 变量中的记录)。计数器或过滤器仍发挥作用。要在这种情况下停止,请将环境变量 event_safety 设置为 off。