是什么破VS +指令+继续dprintf之间的区别?(What is the difference

2019-10-24 06:03发布

例如:

dprintf main,"hello\n"
run

生成的输出相同:

break main
commands
  silent
  printf "hello\n"
  continue
end
run

是否有显著优势,使用dprintfcommands ,例如,它是相当快的(如果是的话,为什么?),还是有一些不同的功能?

或者是它主要是一个方便的命令?

资源

在7.9.1源, breakpoint.c:dprintf_command ,它定义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_truedprintfdprintf_after_condition_true
  • bpstat_do_actions_1运行命令

Answer 1:

有两个主要的不同之处。

首先, dprintf具有可被用来制造它在其他方面工作的一些额外的输出模式。 请参阅help set dprintf-channel ,或使用说明书,了解更多信息。 我认为,这些模式是,之所以dprintf加入作为一个独立的实体; 但在同一时间,他们都相当专业,不太可能是普遍关心的。

更有用地,不过, dprintf不干扰next 。 如果你写一个断点,并使用commands ,然后next在这样的断点,GDB会忘掉next ,并作为你输入了continue 。 这是在gdb的脚本语言的长期怪胎。 dprintf不存在这个问题。 (如果您从一个普通的断点需要类似的功能,你可以从Python中做到这一点。)



文章来源: What is the difference between dprintf vs break + commands + continue?
标签: gdb