Oracle® Solaris Studio 12.4:使用 dbx 调试程序

退出打印视图

更新时间: 2015 年 1 月
 
 

效率考虑事项

在所调试程序的执行时间方面,各种事件都有不同程度的开销。但某些事件(如最简单的断点)几乎没有开销。基于单个断点的事件的开销非常小。

多种可能会导致生成数百个断点的断点(如 inclass)仅在创建期间有开销。这是因为 dbx 使用永久性断点,这些断点一直保留在进程中,每次中断时并不会被移除,且每次执行 cont 命令时都会被置入。

stepnext 而言,缺省情况下,恢复进程前会移除所有断点,完成相应步骤后会立即重新插入这些断点。如果使用大量断点或在多产类中使用多个断点,step 命令和 next 命令的执行速度会显著降低。可使用 dbx step_events 环境变量控制是否移除断点并在每次执行 step 命令或 next 命令后重新插入断点。

速度最慢的事件是利用自动单步执行功能的事件。在单步执行每个源代码行的 trace step 命令中,该进程可能非常明显。其他一些事件(如 stop changetrace cond 命令)不仅自动单步执行,而且还必须在执行每一步时对表达式或变量求值。

这些事件的速度非常慢,但通常可以使用 -in 修饰符将事件与函数绑定来克服速度慢这一问题。例如:

trace next -in mumble
stop change clobbered_variable -in lookup

请勿使用 trace -in main,这是因为 tracemain 调用的函数中也有效。如果怀疑 lookup() 函数会损坏变量,请使用此修饰符。