从python脚本获取函数和系统调用

从python脚本获取函数和系统调用,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,是否有任何工具、软件包或模块可以提供调用方和被调用方函数、所有函数调用和系统调用的详细信息?您可以使用该模块: inspect模块提供了几个有用的函数来帮助 有关活动对象的信息,如模块、类、方法、, 函数、回溯、帧对象和代码对象。例如 它可以帮助您检查类的内容,检索源代码 方法的代码,提取函数的参数列表并设置其格式, 或者获取显示详细回溯所需的所有信息 此模块提供四种主要的服务:类型 检查、获取源代码、检查类和函数,以及 检查解释器堆栈 您可以使用以下模块: inspect模块提供了几个有用的函

是否有任何工具、软件包或模块可以提供调用方和被调用方函数、所有函数调用和系统调用的详细信息?

您可以使用该模块:

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,我正在寻找静态字节码生成,然后检查所有函数和系统调用。提前准备好。