当前位置: 首页 > 面试题库 >

使用GDB进行Python内存调试

陶寒
2023-03-14
问题内容

我们有一个使用OpenSSL的Python绑定的Linux应用程序,我怀疑它会导致随机崩溃。有时,我们会看到它崩溃并显示以下消息:

Python致命错误:GC对象已被跟踪

这似乎是库方面的编程错误,或者是内存损坏的症状。给定一个核心文件,有什么办法知道它执行的最后一行Python源代码?还是如果它附加在GDB中?我意识到这可能是所有已编译的字节码,但是我希望那里有人解决了这个问题。当前,它正在运行,并且跟踪模块处于活动状态,我们希望它会再次发生,但是可能要花很长时间。


问题答案:

是的,您可以执行以下操作:

(gdb) print PyRun_SimpleString("import traceback; traceback.print_stack()")
  File "<string>", line 1, in <module>
  File "/var/tmp/foo.py", line 2, in <module>
    i**2
  File "<string>", line 1, in <module>
$1 = 0

也应该可以使用pystackpython
gdbinit文件中定义的命令,但是它对我不起作用。如果您想对此进行讨论,请在此处进行讨论。

另外,如果您怀疑内存问题,值得注意的是valgrind,如果您准备重新编译它,则可以将其与python一起使用。此处描述该过程。



 类似资料:
  • 从 FreeBSD 2.2 开始提供了对这一功能的支持, 实际上, 它也是一种非常灵活的方式。 GDB 很久以前就已经支持 远程调试 了。 这是通过一种非常简单的串口线协议来实现的。 与前面介绍的方法不同, 要使用这种方式, 您需要使用两台计算机。 其中一台用于提供调试环境, 其中包括全部源代码, 以及一份包含全部符号的编译好的内核; 另一台则运行这一内核 (已经脱去了调试信息)。 您应使用 co

  • 开发程序过程中调试代码是开发者经常要做的一件事情,Go语言不像PHP、Python等动态语言,只要修改不需要编译就可以直接输出,而且可以动态的在运行环境下打印数据。当然Go语言也可以通过Println之类的打印数据来调试,但是每次都需要重新编译,这是一件相当麻烦的事情。我们知道在Python中有pdb/ipdb之类的工具调试,Javascript也有类似工具,这些工具都能够动态的显示变量信息,单步

  • 问题内容: 我是Visual Studio用户,习惯于调试断点。我现在在Linux环境中工作,并且正在使用Eclipse作为IDE。我是linux和eclipse的新手。我不知道如何在Eclipse中使用gdb。我尝试在命令行中使用gdb,但它并不像拥有UI那样容易。 如何在Eclipse中使用gdb? 问题答案: 以下说明适用于Eclipse 3.5(Galileo)。对于3.6(Helios)

  • 问题内容: 我知道我们可以使用几个命令来访问和读取内存:例如,print,p,x … 但是,如何在任何特定位置更改内存的内容(在GDB中调试时)? 问题答案: 最简单的方法是设置程序变量(请参见GDB:Assignment): 或者,您也可以按地址更新任意(可写)位置: 还有更多。阅读手册。

  • 问题内容: 我是内核开发的新手,我想知道如何使用QEMU和gdb运行/调试Linux内核。我实际上正在阅读罗伯特·洛夫(Robert Love)的书,但不幸的是,它没有帮助读者了解如何安装适当的工具来运行或调试内核。因此,我要做的是遵循本教程http://opensourceforu.efytimes.com / 2011/02 / kernel-development-debugging-usi

  • 问题内容: 在linux下,我可以使用GDB调试当前正在运行的进程吗? 问题答案: 是。使用命令。查看此链接以获取更多信息。打字在GDB控制台提供了以下: 附加到GDB外部的进程或文件。该命令附加到另一个目标,该目标与上一个“ ”命令的类型相同(“ ”将显示目标堆栈)。该命令可以将进程ID,进程名称(带有可选的进程ID作为后缀)或设备文件作为参数。对于进程ID,您必须具有向该进程发送信号的权限,并