Как определить, в какой функции происходит сохранение файла?

Есть open-source библиотека openbr.

Вызывается процедура определения лиц по фотографии, все как в примере:
transform = br::Transform::fromAlgorithm("FaceRecognition");
br::Globals->enrollAll = true;
query = br::TemplateList::fromGallery("http://127.0.0.1:8093/1.bmp");
query >> *transform;
Код замечательно отрабатывает, лица определяются, все счастливы.

Но, на строчке:
query >> *transform;
в текущей директории проекта создается паразитный файл img.jpg.

Вшагивание в сами исходники openbr (сборка отладочной версии которой например под win_x64, очевидно, происходит по соответствующей инструкции, только в пункте 6.а вместо DCMAKE_BUILD_TYPE=Release нужно писать DCMAKE_BUILD_TYPE=Debug) привели в DistributeTemplateTransform::project() файла openbr/plugins/meta.cpp
Там, после выполнения вот такого кода
futures.waitForFinished();
создается злосчастный файл.
Но сохранение происходит явно в другом потоке, а эта функция просто ждет завершения асинхронной операции.
Мне нужно найти, в каком именно месте другого потока этот файл создается (а может вообще он создается в прилинкованной к openbr opencv, я могу только гадать).
  • Вопрос задан
  • 3538 просмотров
Решения вопроса 1
Nyashkoshkko
@Nyashkoshkko Автор вопроса
Оказалось, что это совсем не openbr, а глупый QCameraImageCapture, который тоже присутствует в программе, с вполне себе прописанным ::CaptureToBuffer

capturer = new QCameraImageCapture(camera); // создаем экземпляр класса, который умеет взаимодействовать с камерой и получать от нее изображения
capturer->setCaptureDestination(QCameraImageCapture::CaptureToBuffer); // говорим этому классу, что изображения нужно брать не в файл, а в буфер
все равно, при каждом вызове
capturer->capture();
упрямо создавал файл img.jpg в папке с программой.

Вылечилось так:
capturer->capture("/dev/null");

Большое спасибо всем за ответы, впервые в жизни использую помощь сообщества для решения эпохальных, в общем-то (но об этом позже, в отдельной статье) задач, и подобный интерактив и отзывчивость воодушевляет!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ntkt
@ntkt
Потомственный рыцарь клавиатуры и паяльника
В общем случае задача «узнать, кто что сделал» решается API-перехватчиком, например, Process Monitor (procmon.exe) от Microsoft.
technet.microsoft.com/ru-ru/sysinternals/bb896645.aspx

1) Запускаете Process Monitor
2) настраиваете фильтр на нужный процесс/файл/…
3) воспроизводите проблему
4) находите соотв. событие в логе Process Monitor (например, создание файла)
5) по двойному клику на событие можно найти стек вызовов. Всё.

А иначе придется честно ловить дебаггером, конечно (по старинке ставить брейкпоинт на NtCreateFile).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы