如何在GDB的断点处打印当前的源代码行?

时间:2013-07-27 02:02:18

标签: gdb

我想在gdb中设置一个“滚动”断点;只需打印一些信息来打印当前的源代码行;然后继续我从这样的事情开始:

break doSomething
commands
  continue
end

这本身打印出来:

Breakpoint 1, doSomething () at myprog.c:55
55  void doSomething() {

我想删除“Breakpoint X ... at ...”消息,可以使用silent完成 - 然后打印出源代码行;所以我试过了:

break doSomething
commands
  silent
  list 
  continue
end

这导致10行列表,如下所示

50  // some comments
...
55  void doSomething() {
...
59  // other comments

问题是,说list 1将再次给出10行,只是从第一行开始;虽然做list +0,+0确实只提供一行来源 - 但错误的行(在我的情况下,它给出了第50行)。

那么,我意识到可以使用程序计数器$pc获取并打印当前程序地址 - 并且假设一个人也可以列出程序地址,我试过这个:

break doSomething
commands
  silent
  #print $pc
  list *$pc,+0
  continue
end

这会产生正确的源代码行 - 但由于某种原因,再次使用额外的消息,这次“ADDR在X ...中”:

0x8048fe0 is in doSomething (myprog.c:55).
55  void doSomething() {

有关如何打印源行的任何想法?

作为一个子问题 - 是否有可能以某种方式捕获list命令的输出,并将其用作gdb脚本方言中printf的参数? (我很确定捕获gdb命令输出可以通过python gdb脚本完成,但是)...

1 个答案:

答案 0 :(得分:3)

嗯,我觉得我在gdb的Python上有更好的地方;现在我可以让输出看起来像这样(使用gdb 7.3.50.20110806-cvs):

[  56] 0x8048fe0         myprog.c:55    void doSomething() {
[  56] 0x8049058         myprog.c:63    }

在大多数情况下,我尝试使用Symbol-Tables-In-Python来实现这一点(原来还有一个关于此的问题:gdb find memory address of line number)。

但是,出于某种原因,当我使用Symtab_and_line.line时,“表示此对象的当前行号”,它似乎没有改变?在上面的例子中,它是方括号中的第一个数字,并且始终位于56(在两种情况下都是错误的)。人们原本希望API能涵盖所有这些内容;虽然行号在那里(虽然错了吗?) - 我无法在任何地方找到相应源代码行的字符串内容,作为对象属性。另一方面,当我使用gdb.execute("list *$pc,+0")根据OP直接查询gdb当前行时,我得到正确的行号 - 但是,我必须另外拆分和解析Python中的字符串{{ 1}}

仍然,总比没有好 - 这是(嵌入在gdb脚本中的Python)代码;把它扔进你的:/

.gdbinit