如何识别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] 
+0

谢谢,我会尽快尝试 – user2061944