如何识别python代码中的特定GDB断点?
问题描述:
我试图脚本GDB与蟒蛇。我有一个GDB的本地脚本文件,它提供了一个python脚本文件。在.gdb文件中,我在不同的函数中声明了一些断点。我可以使用python脚本在这些断点上执行next/step/continue并打印不同的变量。但是我对每个断点都有一个独特的python函数和特定的prints.I想让它更好更通用。如何识别python代码中的特定GDB断点?
我想是在Python代码一个函数和方法来确定其断点时,这样我可以打印取决于断点不同的变量。如果我只是打印它们,那么我将得到超出范围的错误。
我已经确认并GDB也允许通过提到here定义在Python代码中的断点使用断点玩弄的蟒蛇。
有另一种方法做这个任务(保持断点定义了Python代码),或者用gdb断点类的唯一途径? 我想要的只是一张支票,它可以帮助识别它是哪个断点。
感谢
答
有另一种方法做这个任务(保持断点定义了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]
谢谢,我会尽快尝试 – user2061944