我正在运行Python GUI应用程序.我想从中调用和控制GDB,比如加载可执行文件,设置断点等.我看到GDB有一个命令行界面,可以通过向GDB进程发送字符串来使用,但是我想用Python的方式来做.有gdb.py吗?我看到"archer"分支有类似"import gdb"的东西,但它在Ubuntu的默认Python安装中不起作用.我从哪里获得这个模块,还是有其他方法可以从Python控制GDB?
我正在使用Python通过批处理命令控制GDB.这是我如何调用GDB:
$ gdb --batch --command=cmd.gdb myprogram
Run Code Online (Sandbox Code Playgroud)
该cmd.gdb列表只包含调用Python脚本的行
source cmd.py
Run Code Online (Sandbox Code Playgroud)
并且cmd.py脚本尝试创建断点和附加命令列表
bp = gdb.Breakpoint("myFunc()") # break at function in myprogram
gdb.execute("commands " + str(bp.number))
# then what? I'd like to at least execute a "continue" on reaching breakpoint...
gdb.execute("run")
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何将任何GDB命令附加到Python脚本的断点.有没有办法做到这一点,或者我错过了一些更容易和更明显的自动执行断点特定命令的工具?
有什么方法可以将内部 gdb 命令的输出通过管道传输到某些 shell 命令,例如- ingrep的变体?[cmd] ! grepmdb
更清楚地说:在solaris中mdb你可以写
main::dis ! grep call
Run Code Online (Sandbox Code Playgroud)
检测从 main 调用哪些函数(或 grep 一些寄存器名称以查看它是如何更改的)。我很感兴趣是否有可能只在 gdb 中这样做而无需从 gdb 切换。
我想设置一个"滚动"断点gdb; 只打印当前的源代码行,并提供一些信息; 然后继续 我从这样的事情开始:
break doSomething
commands
continue
end
Run Code Online (Sandbox Code Playgroud)
这本身打印出:
Breakpoint 1, doSomething () at myprog.c:55
55 void doSomething() {
Run Code Online (Sandbox Code Playgroud)
我想删除"Breakpoint X ... at ..."消息,可以使用silent- 然后打印出源代码行; 所以我试过了:
break doSomething
commands
silent
list
continue
end
Run Code Online (Sandbox Code Playgroud)
这导致10行列表,如下所示
50 // some comments
...
55 void doSomething() {
...
59 // other comments
Run Code Online (Sandbox Code Playgroud)
问题是,说list 1再次给出10行,只是从第一行开始; 虽然做的list +0,+0确实只提供一行来源 - 但错误的行(在我的情况下,它给出了第50行).
那么,我意识到可以通过使用程序计数器获取并打印当前程序地址$pc- 并且考虑到也可以列出程序地址,我试过这个:
break doSomething
commands
silent
#print $pc
list *$pc,+0
continue
end
Run Code Online (Sandbox Code Playgroud)
这会产生正确的源代码行 - 但由于某种原因,再次使用额外的消息,这次"ADDR在X …