针对时间影响的bug(显然)的调试策略

Car*_*ory 6 python python-2.7

我对python缺乏经验,所以我发现自己不知道如何处理这个bug.我继承了一个python应用程序,主要只是将文件和文件夹从一个地方复制到另一个地方.所有文件和文件夹都在本地计算机上,并且用户具有完全管理权限,因此此处没有网络或安全问题.

我发现很多文件无法从一个目录复制到另一个目录,除非我以某种方式减慢代码速度.如果我只是运行该程序它失败了,但是如果我单步执行调试器或print向复制循环添加语句,它就会成功.差异似乎是循环的时间或在内存中移动的东西.

我以前在编译语言中看到过这种错误,它通常表示竞争条件或内存损坏.但是,只有一个线程并且没有与其他进程的交互,因此竞争条件似乎是不可能的.内存损坏仍然存在,但我不确定如何用python调查这种可能性.

这是有问题的循环.如您所见,它相当简单:

def concat_dirs(dir, subdir):
    return dir + "/" + subdir

for name in fullnames:
    install_name = concat_dirs(install_path, name)
    dirname = os.path.dirname(install_name)
    if not os.path.exists(dirname): 
        os.makedirs(dirname)
    shutil.copyfile(concat_dirs(java_path, name), install_name)
Run Code Online (Sandbox Code Playgroud)

该循环通常无法复制文件,除非我使用调试器单步执行或shutil.copyfile在行后添加此语句.

    print "copied ", concat_dirs(java_path, name), " to ", install_name
Run Code Online (Sandbox Code Playgroud)

如果我在调试中添加该语句或逐步执行,则循环可以完美且一致地工作.我很想对声明说"足够好",print但我知道这只是掩盖了一个潜在的问题.

我不是要你调试我的代码,因为我知道你不能; 我要求调试策略.我该如何找到这个bug?

Kir*_*ser 1

确实有一个竞争条件:你检查 dirname 是否存在,然后尝试创建它。如果发生意外情况,这应该会导致程序崩溃,但是......

在 Python 中,我们说请求原谅比请求许可更容易。每次都创建该目录,如果它已经存在则道歉:

import errno
import os

for name in fullnames:
    source_name = os.path.join(java_path, name)
    dest_name = os.path.join(install_path, name)
    dest_dir = os.path.dirname(dest_name)

    try:
        os.makedirs(dest_dir)
    except OSError as exc:
        if exc.errno != errno.EEXIST:
            raise

    shutil.copyfile(source_name, dest_name)
Run Code Online (Sandbox Code Playgroud)

除了以非活泼的方式尝试并看看会发生什么之外,我不确定如何解决此问题。可能存在一个微妙的文件系统问题导致运行异常。