从python脚本获取函数和系统调用
是否有任何工具、软件包或模块可以提供调用方和被调用方函数、所有函数调用和系统调用的详细信息?您可以使用该模块: inspect模块提供了几个有用的函数来帮助 有关活动对象的信息,如模块、类、方法、, 函数、回溯、帧对象和代码对象。例如 它可以帮助您检查类的内容,检索源代码 方法的代码,提取函数的参数列表并设置其格式, 或者获取显示详细回溯所需的所有信息 此模块提供四种主要的服务:类型 检查、获取源代码、检查类和函数,以及 检查解释器堆栈 您可以使用以下模块: inspect模块提供了几个有用的函数来帮助 有关活动对象的信息,如模块、类、方法、, 函数、回溯、帧对象和代码对象。例如 它可以帮助您检查类的内容,检索源代码 方法的代码,提取函数的参数列表并设置其格式, 或者获取显示详细回溯所需的所有信息 此模块提供四种主要的服务:类型 检查、获取源代码、检查类和函数,以及 检查解释器堆栈从python脚本获取函数和系统调用,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,是否有任何工具、软件包或模块可以提供调用方和被调用方函数、所有函数调用和系统调用的详细信息?您可以使用该模块: inspect模块提供了几个有用的函数来帮助 有关活动对象的信息,如模块、类、方法、, 函数、回溯、帧对象和代码对象。例如 它可以帮助您检查类的内容,检索源代码 方法的代码,提取函数的参数列表并设置其格式, 或者获取显示详细回溯所需的所有信息 此模块提供四种主要的服务:类型 检查、获取源代码、检查类和函数,以及 检查解释器堆栈 您可以使用以下模块: inspect模块提供了几个有用的函
如果您想评测您的应用程序,您可以用不到20行的python编写自己的堆栈采样器
import collections
import signal
class Sampler(object):
def __init__(self, interval=0.001):
self.stack_counts = collections.defaultdict(int)
self.interval = 0.001
def _sample(self, signum, frame):
stack = []
while frame is not None:
formatted_frame = '{}({})'.format(frame.f_code.co_name,
frame.f_globals.get('__name__'))
stack.append(formatted_frame)
frame = frame.f_back
formatted_stack = ';'.join(reversed(stack))
self.stack_counts[formatted_stack] += 1
signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0)
def start(self):
signal.signal(signal.VTALRM, self._sample)
signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0)
调用Sampler.start()将设置在interval指定的秒数之后发送的Unix信号ITIMER_VIRTUAL。这将实质上创建一个重复报警,该报警将运行_sample方法
当信号触发时,_sample函数将保存应用程序的堆栈,并跟踪我们对同一堆栈进行了多少次采样。频繁采样的堆栈对应于应用程序花费大量时间的代码路径
借用自的代码如果您想评测您的应用程序,您可以在python中用不到20行代码编写自己的堆栈采样器
import collections
import signal
class Sampler(object):
def __init__(self, interval=0.001):
self.stack_counts = collections.defaultdict(int)
self.interval = 0.001
def _sample(self, signum, frame):
stack = []
while frame is not None:
formatted_frame = '{}({})'.format(frame.f_code.co_name,
frame.f_globals.get('__name__'))
stack.append(formatted_frame)
frame = frame.f_back
formatted_stack = ';'.join(reversed(stack))
self.stack_counts[formatted_stack] += 1
signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0)
def start(self):
signal.signal(signal.VTALRM, self._sample)
signal.setitimer(signal.ITIMER_VIRTUAL, self.interval, 0)
调用Sampler.start()将设置在interval指定的秒数之后发送的Unix信号ITIMER_VIRTUAL。这将实质上创建一个重复报警,该报警将运行_sample方法
当信号触发时,_sample函数将保存应用程序的堆栈,并跟踪我们对同一堆栈进行了多少次采样。频繁采样的堆栈对应于应用程序花费大量时间的代码路径
从什么样的详细信息中借用的代码?你是说评测,使用cProfile子进程/多进程模块将进行系统调用,操作系统模块可以帮助你跟踪。@akashkarothiya,我正在寻找静态字节码生成,然后检查所有函数和系统调用。Thanx。什么样的详细信息?你的意思是分析,使用
cProfile
子进程/多处理模块将进行系统调用,操作系统模块可以帮助你跟踪。@akashkarothiya,我正在寻找静态字节码生成,然后检查所有函数和系统调用。提前准备好。