Python 对不需要的系统调用引发异常

Python 对不需要的系统调用引发异常,python,debugging,system-calls,Python,Debugging,System Calls,我被告知修复遗留应用程序中的错误 我可以重现一个bug,但我不知道在哪个python源代码行执行错误 我可以看到strace的相关故障:打开了一个文件,但不应该打开 我想让相关的open()linux系统调用在python解释器中引发一个异常。我的目标:我希望看到stacktrace能够修复bug 通过这种方式,我可以避免使用调试器在许多行中单步执行所需的时间 其他词也一样:如果执行syscall,这将导致strace输出open(“/somefile”,O_RDONLY)=4,python解释

我被告知修复遗留应用程序中的错误

我可以重现一个bug,但我不知道在哪个python源代码行执行错误

我可以看到
strace
的相关故障:打开了一个文件,但不应该打开

我想让相关的open()linux系统调用在python解释器中引发一个异常。我的目标:我希望看到stacktrace能够修复bug

通过这种方式,我可以避免使用调试器在许多行中单步执行所需的时间

其他词也一样:如果执行syscall,这将导致strace输出
open(“/somefile”,O_RDONLY)=4
,python解释器将返回退出

有人有办法吗


如果您不明白我在寻找什么,请留下评论。

在导入模块之前,我们可以在
打开
上进行修补,下面是一个示例:

test.py
中:

def func():
    with open('test', 'w') as f:
        pass
try:
    import __builtin__ # for python2
except ImportError:
    import builtins as __builtin__ #for python3

import copy
import traceback

orig_open = copy.copy(__builtin__.open)

def myopen(*args):
    traceback.print_stack()
    return orig_open(*args)

__builtin__.open = myopen

from test import func # Note that we import the module after patching on open()

func()
test2.py
中:

def func():
    with open('test', 'w') as f:
        pass
try:
    import __builtin__ # for python2
except ImportError:
    import builtins as __builtin__ #for python3

import copy
import traceback

orig_open = copy.copy(__builtin__.open)

def myopen(*args):
    traceback.print_stack()
    return orig_open(*args)

__builtin__.open = myopen

from test import func # Note that we import the module after patching on open()

func()
当在
test2.py
中调用
func()
时,将打印调用堆栈:

$ python test2.py 
  File "test2.py", line 19, in <module>
    func()
  File "/tmp/test.py", line 4, in func
    with open('test', 'w') as f:
  File "test2.py", line 12, in myopen
    traceback.print_stack()
$python test2.py
文件“test2.py”,第19行,在
func()
文件“/tmp/test.py”,第4行,在func中
打开('test','w')作为f:
myopen中第12行的文件“test2.py”
traceback.print_stack()

您可以在gdb下运行python,在
open()
syscall上设置一个(有条件的)断点(或者更确切地说,是libc中调用它的存根函数),当遇到断点时,向python进程发送一个
SIGINT
信号并让它继续,因此,python脚本的执行应该以所需的堆栈跟踪中断

下面的shell脚本自动执行该过程

用法:

在打开时堆栈跟踪
文件名
脚本.py