我有这个Python应用程序不时被卡住,我无法找到在哪里.
有没有办法告诉Python解释器向您显示正在运行的确切代码?
某种即时堆栈跟踪?
相关问题:
Python:如何在被调用的方法中获取调用者的方法名?
假设我有两种方法:
def method1(self):
...
a = A.method2()
def method2(self):
...
Run Code Online (Sandbox Code Playgroud)
如果我不想对method1进行任何更改,如何在method2中获取调用者的名称(在此示例中,名称为method1)?
在调试Python脚本时,我真的想知道整个程序的整个调用堆栈.一个理想的情况是,如果有一个python的命令行标志会导致Python在调用它们时打印所有函数名称(我检查过man Python2.7,但没有找到这种类型的任何东西).
由于此脚本中的函数数量,如果可能,我不希望在每个函数和/或类的开头添加print语句.
一个中间的解决方案是使用PyDev的调试器,放置几个断点并检查程序中给定点的调用堆栈,所以我暂时会使用这种方法.
如果存在这样的方法,我仍然希望看到在程序的整个生命周期中调用的所有函数的完整列表.
我正在研究用Python编写的某种系统服务(实际上它只是一个日志解析器).这个程序应该连续工作很长时间(希望我的意思是几天和几周没有失败和重新启动的需要).这就是为什么我担心内存消耗.
我将来自不同站点的进程内存使用情况的不同信息汇总到一个简单的函数中:
#!/usr/bin/env python
from pprint import pprint
from guppy import hpy
from datetime import datetime
import sys
import os
import resource
import re
def debug_memory_leak():
#Getting virtual memory size
pid = os.getpid()
with open(os.path.join("/proc", str(pid), "status")) as f:
lines = f.readlines()
_vmsize = [l for l in lines if l.startswith("VmSize")][0]
vmsize = int(_vmsize.split()[1])
#Getting physical memory size
pmsize = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
#Analyzing the dynamical memory segment - total number of objects in memory and heap size
h = hpy().heap()
if …Run Code Online (Sandbox Code Playgroud) 这是一个相当无用的断言错误; 它没有告诉所涉及的表达式的值(假设使用的常量实际上是变量名):
$ python -c "assert 6-(3*2)"
[...]
AssertionError
Run Code Online (Sandbox Code Playgroud)
assert在Python中有更好的实现更加花哨吗?它不得在执行时引入额外的开销(断言失败时除外)..如果使用-Oflag,则必须关闭.
编辑:我知道assert的第二个参数是一个字符串.我不想写一个..因为它是在被断言的表达式中编码的.干(不要重复自己).
我有一个很大的遗留Python方法,其中包含大约20个return语句.
该方法不应该返回,None但它会这样做.它在一个简单的测试用例中是可重复的.
到目前为止,我使用了一个调试器并逐行遍历代码以找到匹配的return语句.
但是有更简单的方法吗?
一旦方法返回None,有没有办法提出异常?
当然我需要看到包含return语句的行.
例:
def big_method(arg1, some_var):
#.... many returns
if arg1:
return some_var # <------
#... many returns
assert not big_method(True, None) is None
Run Code Online (Sandbox Code Playgroud)
上面是一个简单的代码片段.结果:
Traceback (most recent call last):
File "/home/modwork_vums_d/src/manyreturns.py", line 8, in <module>
assert not big_method(True, None) is None
AssertionError
Run Code Online (Sandbox Code Playgroud)
上面的追溯并没有多大帮助,因为我想看到内线 big_method().在上面的例子中,我想看看我标记的是哪个<------.
我使用PyCharm,但欢迎使用纯Python或其他解决方案.
仅供记录.有一个后续问题试图在PyCharm中启用此功能:PyCharm:调试:r(eturn)继续执行,直到当前函数返回
我正在编写一些可以在堆栈中生成Exceptions的代码,并且我有一个靠近顶层的层,它捕获这些异常并将它们发送出去以供错误处理模块处理.我想要的是错误处理模块能够将堆栈跟踪打印到其错误日志中,但我发现很难弄清楚这样做的方法是什么.
关于背景的一些注意事项:
代码是多线程的,所以我不确定sys.last_traceback的行为
我已经尝试在异常本身的构造函数中捕获堆栈.在这种情况下,sys.last_traceback有时是None(因为它只存在于未处理的异常情况下),并且并不总是正确的.我目前正在玩弄使用
self.stack = traceback.format_stack()[: - 2]
在异常的构造函数中,虽然这在信息方面看起来很有前景,但它并不像是"正确"的方式来做到这一点
我能够找到的所有如何执行此操作的示例都显示了如何在except块中打印堆栈跟踪,而不是在以后的错误处理模块中打印,这似乎与我想要的行为不同.(例如,参见Python代码中的方法打印当前调用堆栈)
我已经在python docs(http://docs.python.org/library/traceback.html)中挖掘了traceback模块,并且无法弄清楚这是否符合我的要求.它似乎主要关注格式化回溯,因为您可能从sys.last_traceback检索.它有一些使用示例,但没有一个与我正在尝试做的事情相符.
我不相信我是第一个想要这样做的人,所以我必须遗漏一些东西.任何正确方向的指针都非常赞赏.
出于调试/记录目的,我想将完整堆栈写入文件(例如在此问题中)。我可以使用traceback.format_stack(). 但是,我希望它看起来像IPython输出的更详细的回溯,例如,格式化为IPython.core.ultratb.VerboseTB.
看起来类和方法IPython.core.ultratb需要有关异常的信息,因为它们是为回溯而设计的。但我也不例外:我只想以冗长的方式显示堆栈。
如何使用 的输出方法IPython.core.ultratb.VerboseTB来格式化堆栈,例如报告的traceback.extract_stack()或inspect.stack()?
所以我正在尝试使用sys.getrecursionlimit()和sys.setrecursionlimit()方法。默认递归限制为3000.
我尝试使用以下代码检查它:
def recursive(n):
print(n)
recursive(n+1)
recursive(0)
Run Code Online (Sandbox Code Playgroud)
它确实将数字打印到2979,它会延迟一秒钟,打印2980然后提高RecursionError
RecursionError: maximum recursion depth exceeded while calling a Python object
Run Code Online (Sandbox Code Playgroud)
我知道当它超过sys.getrecursionlimit()返回的递归限制时应该引发错误,但它没有
似乎它总是在递归限制之前执行 20 次
我也试过这个:
sys.setrecursionlimit(100)
def recursive(n):
print(n)
recursive(n+1)
recursive(0)
Run Code Online (Sandbox Code Playgroud)
它仍然做同样的事情,将所有数字打印到79,延迟一秒钟,打印80然后引发完全相同的错误
为什么它会在超出我们设置或得到的实际递归限制之前引发错误sys.getrecursionlimit()?