Профилировщик времени в инструментах

У меня проблемы с запуском Time Profiler в Xcode, как для приложений Mac, так и для приложений iPhone.

Шаги, которые у меня есть. пытались открыть Time Profiler, щелкнув раскрывающийся список выбора цели, выбрав мою книгу iPhone или Mac. Выберите цель -> myApp. Если я выбираю приложение для Mac, то нажимаю кнопку записи, в окне появляется большое желтое предупреждение о невозможности настроить триггер выборки для x. Если я выберу приложение для iPod, кнопка записи останется серой и ее нельзя будет нажать.

Любые идеи, что я ' переименовать это напишите в него, потому что в Windows (по крайней мере) кажется, что вы не можете удалить, переименовать или записать в ...

Я пытался использовать FileLock , чтобы получить монопольный доступ к файлу чтобы:

  • удалить его
  • переименовать его
  • записать в него

Потому что в Windows (по крайней мере) кажется, что вы не можете удалить, переименовать или записать в файл, который уже используется. Написанный мною код выглядит примерно так:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;

public abstract class LockedFileOperation {

    public void execute(File file) throws IOException {

        if (!file.exists()) {
            throw new FileNotFoundException(file.getAbsolutePath());
        }

        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

        try {
            // Get an exclusive lock on the whole file
            FileLock lock = channel.lock();

            try {
                doWithLockedFile(file);
            } finally {
                lock.release();
            }
        } finally {
            channel.close();
        }
    }

    public abstract void doWithLockedFile(File file) throws IOException;
}

Вот несколько модульных тестов, демонстрирующих проблему. Для запуска третьего теста вам потребуется Apache commons-io в пути к классам.

import java.io.File;
import java.io.IOException;

import junit.framework.TestCase;

public class LockedFileOperationTest extends TestCase {

    private File testFile;

    @Override
    protected void setUp() throws Exception {

        String tmpDir = System.getProperty("java.io.tmpdir");
        testFile = new File(tmpDir, "test.tmp");

        if (!testFile.exists() && !testFile.createNewFile()) {
            throw new IOException("Failed to create test file: " + testFile);
        }
    }

    public void testRename() throws IOException {
        new LockedFileOperation() {

            @Override
            public void doWithLockedFile(File file) throws IOException {
                if (!file.renameTo(new File("C:/Temp/foo"))) {
                    fail();
                }
            }
        }.execute(testFile);
    }

    public void testDelete() throws IOException {
        new LockedFileOperation() {

            @Override
            public void doWithLockedFile(File file) throws IOException {
                if (!file.delete()) {
                    fail();
                }
            }
        }.execute(testFile);
    }

    public void testWrite() throws IOException {
        new LockedFileOperation() {

            @Override
            public void doWithLockedFile(File file) throws IOException {
                org.apache.commons.io.FileUtils.writeStringToFile(file, "file content");
            }
        }.execute(testFile);
    }
}

Ни один из тестов не прошел. Первые 2 терпят неудачу, а последний вызывает это исключение:

java.io.IOException: The process cannot access the file because another process has locked a portion of the file
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:247)
    at org.apache.commons.io.IOUtils.write(IOUtils.java:784)
    at org.apache.commons.io.IOUtils.write(IOUtils.java:808)
    at org.apache.commons.io.FileUtils.writeStringToFile(FileUtils.java:1251)
    at org.apache.commons.io.FileUtils.writeStringToFile(FileUtils.java:1265)

Похоже, что метод lock () устанавливает блокировку файла, которая затем не позволяет мне переименовать / удалить / записать его. Я предполагал, что блокировка файла предоставит мне эксклюзивный доступ к файлу, поэтому я мог затем переименовать / удалить / записать его, не беспокоясь о том, обращается ли к нему какой-либо другой процесс.

Либо я неправильно понимаю FileLock или это не подходящее решение моей проблемы.

13
задан Dónal 27 October 2014 в 12:52
поделиться