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

显示正在运行的Python应用程序的堆栈跟踪

孟正志
2023-03-14
问题内容

我有这个Python应用程序,它有时会卡住,我找不到位置。

有什么方法可以让Python解释器向您显示正在运行的确切代码吗?

某种动态堆栈跟踪?


问题答案:

我有用于以下情况的模块-进程将长时间运行,但有时由于未知且不可复制的原因而卡住。它有点hacky,并且只能在unix上运行(需要信号):

import code, traceback, signal

def debug(sig, frame):
    """Interrupt running process, and provide a python prompt for
    interactive debugging."""
    d={'_frame':frame}         # Allow access to frame object.
    d.update(frame.f_globals)  # Unless shadowed by global
    d.update(frame.f_locals)

    i = code.InteractiveConsole(d)
    message  = "Signal received : entering python shell.\nTraceback:\n"
    message += ''.join(traceback.format_stack(frame))
    i.interact(message)

def listen():
    signal.signal(signal.SIGUSR1, debug)  # Register handler

要使用它,只需在程序启动时在某个时候调用listen()函数(您甚至可以将其粘贴在site.py中,以使所有python程序都使用它),然后使其运行。在任何时候,使用kill或在python中向进程发送SIGUSR1信号:

    os.kill(pid, signal.SIGUSR1)

这将导致程序在当前位置中断到python控制台,向您显示堆栈跟踪,并允许您操作变量。使用control-d(EOF)继续运行(尽管请注意,您可能会在发出信号时中断任何I
/ O等,因此它并不是完全非侵入式的。

我有另一个执行相同功能的脚本,除了它通过管道与正在运行的进程通信(允许调试后台进程等)。它在这里发布有点大,但我已将其添加为python食谱。



 类似资料:
  • 问题内容: 我正在研究非常庞大的基于Java Web的应用程序。由于在开发过程中没有完成正确的日志记录,因此我很难设置断点并调试应用程序,因为我不知道执行顺序。在执行一些操作之后,是否有任何机制可以获取正在运行的Java应用程序的完整调用堆栈。 我在网上搜索了很长时间,但无法找到具体的解决方案。如果有东西请给我建议。谢谢 问题答案: 方法1:从命令行使用Jstack实用程序(JDK发行版的一部分)

  • 问题内容: 我确实有一个jenkins实例,它陷入了某种无休止的循环,没有任何可见的活动。 我可以获得正在运行的进程的信息,那么如何生成可用于错误报告的跟踪? 我在linux上运行。 问题答案: 尝试使用jstack。它会为您提供线程正在执行的操作的完整列表。它所需要的只是进程pid。

  • 前言我改了标题。很难理解为什么在调试时,有时未被捕获的异常会向Logcat输出“致命异常”,而有时不会。 下面的简化示例在我到达 line 时崩溃了。Logcat 内部没有堆栈跟踪或其他指示,说明出了什么问题。我运行的是 Android Studio 3.0.0beta4。 为什么它会崩溃?(更新-崩溃是由于安全例外) 为什么Logcat不显示堆栈跟踪或其他错误 更新好了,我知道它为什么崩溃了。我

  • 我试图在Google Play Store中调试我的应用程序的几个崩溃,但是Play Store中显示的堆栈跟踪显示的是Java文件名和行号,而不是直接引用我的Kotlin代码。我在Android Studio中查看了Java代码,但是行号不匹配。 为了查看Java代码,我转换成字节代码,然后反编译成Java。在Android Studio中还有一个更直接的选项“将Kotlin反编译为Java”,

  • 问题内容: 有没有一种方法可以Throwable.printStackTrace(PrintStream s)打印出完整的堆栈轨迹,以便我能看到的最后一行”… 40 more”? 问题答案: 你不需要 该信息存在于堆栈跟踪中的其他位置。来自的文档printStackTrace(): 注意存在包含字符的行。这些行指示此异常的堆栈跟踪的其余部分与由该异常(“封闭”异常)引起的异常的堆栈跟踪的底部指示的

  • 我有一个ASP.NET Core3.0Web API托管在Azure应用服务上。我正在试图弄清楚为什么它会在一个控制器操作方法中抛出一个500内部服务器错误。我已经建立了应用程序洞察力,我可以在Azure Portal上的“失败”页面上看到有500个异常。但是,我看不到它们的堆栈跟踪。在Application Insights或Azure Monitor中打开堆栈跟踪报告需要做些什么吗。附注。即使