我想在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脚本完成,但是)...
答案 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