dprintf vs break + commands + continue有什么区别?

时间:2015-07-27 13:04:58

标签: gdb

例如:

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
  • {li> b->ops->after_condition_true (bs); after_condition_truedprintf
  • dprintf_after_condition_true运行命令

1 个答案:

答案 0 :(得分:3)

有两个主要区别。

首先,dprintf有一些额外的输出模式,可用于使其以其他方式工作。有关详细信息,请参阅help set dprintf-channel或手册。我认为这些模式是dprintf作为单独实体添加的原因;虽然与此同时它们相当专业,不太可能引起普遍关注。

但更有用的是,dprintf不会干扰next。如果您编写断点并使用commands,然后使用next超过此断点,gdb将忘记next并表现得就像您键入了continue一样。这在gdb脚本语言中是一个长期存在的奇怪之处。 dprintf并未遇到此问题。 (如果您需要普通断点的类似功能,可以从Python执行此操作。)