例如:
dprintf main,"hello\n"
run
生成与:
相同的输出break main
commands
silent
printf "hello\n"
continue
end
run
使用dprintf
优于commands
是否有显着优势,例如它的速度要快得多(如果是这样的话?),或者有不同的功能?
或者它主要是一个方便的命令?
来源
在7.9.1源代码中,定义breakpoint.c:dprintf_command
的{{1}}调用dprintf
,这也是create_breakpoint
调用的内容,因此它们似乎都使用相同的基础机构。
主要区别在于break_command
传递dprintf
结构,该结构具有不同的回调并在dprintf_breakpoint_ops
初始化。
initialize_breakpoint_ops
存储命令字符串列表,与dprintf
命令的列表非常相似,具体取决于设置。他们是:
commands
update_dprintf_command_list
type == bp_dprintf
检查后被调用
init_breakpoint_sal
调用。达到断点时:
create_breakpoint
被调用并为达到的断点调用bpstat_stop_status
b->ops->after_condition_true (bs);
after_condition_true
为dprintf
dprintf_after_condition_true
运行命令答案 0 :(得分:3)
有两个主要区别。
首先,dprintf
有一些额外的输出模式,可用于使其以其他方式工作。有关详细信息,请参阅help set dprintf-channel
或手册。我认为这些模式是dprintf
作为单独实体添加的原因;虽然与此同时它们相当专业,不太可能引起普遍关注。
但更有用的是,dprintf
不会干扰next
。如果您编写断点并使用commands
,然后使用next
超过此断点,gdb将忘记next
并表现得就像您键入了continue
一样。这在gdb脚本语言中是一个长期存在的奇怪之处。 dprintf
并未遇到此问题。 (如果您需要普通断点的类似功能,可以从Python执行此操作。)