我正在尝试使用python编写GDB脚本。我有一个GDB的本机脚本文件,它提供了一个python脚本文件。在.gdb文件中,我在不同的函数上声明了一些断点。我可以使用python脚本在这些断点上执行next / step / continue并打印不同的变量。但是我为每个具有特定打印件的断点都有一个独特的python函数。我想让它更好更通用。
我想要的是在python代码中有一个函数,以及一种识别哪个断点被命中的方法,这样我就可以根据断点打印不同的变量。如果我只是打印它们,那么我将超出范围错误。
我已经检查过,GDB还允许在python代码中使用断点来解决断点,如here所述。
还有另一种方法可以完成这项任务(保持断点定义不受python代码限制)或者只使用gdb Breakpoint类吗? 我想要的只是一个检查,可以帮助确定它是哪个断点。
由于
答案 0 :(得分:1)
是否有其他方法可以执行此任务(保持断点定义不受python代码限制) 我想要的只是一个检查,可以帮助确定它是哪个断点。
至少可以使用gdb 7.6。请看我的答案中的第一个例子。您还可以在python脚本中设置所有断点,并在第二个示例中显示。但首先,这是一个测试C ++程序,将在示例中使用。
>cat main.cpp
int a()
{
int p = 0;
p = p +1;
return p;
}
int b()
{
return a();
}
int c()
{
return a();
}
int main()
{
c();
b();
a();
return 0;
}
第一个例子 - 本机gdb脚本中的断点和另一个脚本中的python函数。我使用事件(Events-In-Python):
所以这是一个带有一些断点的本机脚本:
>cat my_check.gdb
b main.cpp:20
b main.cpp:21
b b
source my_check.py
r
q
这是一个python脚本my_check.py:
def my_breakpoint_handler (event):
if (isinstance(event, gdb.BreakpointEvent)):
print event.breakpoint.location
if event.breakpoint.location == "b":
gdb.write("Breakpoint in b()\n")
gdb.execute("bt")
elif event.breakpoint.location == "main.cpp:20":
gdb.write("Breakpoint in main.cpp:20\n")
gdb.execute("info frame")
elif event.breakpoint.location == "main.21":
gdb.write("Breakpoint in main.cpp:21\n")
gdb.write("some info")
else:
pass
gdb.execute("c")
gdb.events.stop.connect(my_breakpoint_handler)
这是测试本身:
>gdb -q -x my_check.gdb a.out
Reading symbols from /import/home/sergey.kurenkov/src/linux.x64.6.0/tests/test.breakpoint/a.out...done.
Breakpoint 1 at 0x40056a: file main.cpp, line 20.
Breakpoint 2 at 0x40056f: file main.cpp, line 21.
Breakpoint 3 at 0x400554: file main.cpp, line 10.
Breakpoint 1, main () at main.cpp:20
20 c();
main.cpp:20
Breakpoint in main.cpp:20
Stack level 0, frame at 0x7fffffffe0d0:
rip = 0x40056a in main (main.cpp:20); saved rip 0x3c4121ecdd
source language c++.
Arglist at 0x7fffffffe0c0, args:
Locals at 0x7fffffffe0c0, Previous frame's sp is 0x7fffffffe0d0
Saved registers:
rbp at 0x7fffffffe0c0, rip at 0x7fffffffe0c8
Breakpoint 2, main () at main.cpp:21
21 b();
main.cpp:21
Breakpoint 3, b () at main.cpp:10
10 return a();
b
Breakpoint in b()
#0 b () at main.cpp:10
#1 0x0000000000400574 in main () at main.cpp:21
[Inferior 1 (process 20798) exited normally]
第二个例子 - python脚本中的所有断点和python函数。
这是一个python gdb脚本:
>cat my_check2.py
class MyBreakpoint (gdb.Breakpoint):
def stop (self):
print self.location
if self.location == "b":
gdb.write("Breakpoint in b()\n")
gdb.execute("bt")
elif self.location == "main.cpp:20":
gdb.write("Breakpoint in main.cpp:20\n")
gdb.execute("info frame")
elif self.location == "main.21":
gdb.write("Breakpoint in main.cpp:21\n")
return False
MyBreakpoint("main.cpp:20")
MyBreakpoint("main.cpp:21")
MyBreakpoint("b")
gdb.execute("r")
gdb.execute("q")
在这里使用:
>gdb -q -x my_check2.py a.out
Reading symbols from /import/home/sergey.kurenkov/src/linux.x64.6.0/tests/test.breakpoint/a.out...done.
Breakpoint 1 at 0x40056a: file main.cpp, line 20.
Breakpoint 2 at 0x40056f: file main.cpp, line 21.
Breakpoint 3 at 0x400554: file main.cpp, line 10.
main.cpp:20
Breakpoint in main.cpp:20
Stack level 0, frame at 0x7fffffffe0d0:
rip = 0x40056a in main (main.cpp:20); saved rip 0x3c4121ecdd
source language c++.
Arglist at 0x7fffffffe0c0, args:
Locals at 0x7fffffffe0c0, Previous frame's sp is 0x7fffffffe0d0
Saved registers:
rbp at 0x7fffffffe0c0, rip at 0x7fffffffe0c8
main.cpp:21
b
Breakpoint in b()
#0 b () at main.cpp:10
#1 0x0000000000400574 in main () at main.cpp:21
[Inferior 1 (process 27434) exited normally]