Я пытаюсь профилировать программу, для которой требуются данные, загруженные из базы данных sqlite. Запуск программы обычно работает как положено, но когда я использую callgrind, открытая база данных пуста (нет таблиц; user_version, установленная в базе данных, возвращается как 0). Файл базы данных найден по правильному пути и, кажется, правильно открыт, но в нем ничего нет.
Тестовая программа (sqlite_test.cpp):
#include <sqlite3.h>
#include <iostream>
#include <sys/stat.h>
bool dbExists() {
struct stat s;
if (stat("testDB", &s) != 0) {
return false;
}
else {
return true;
}
}
int main()
{
if (dbExists())
std::cout << "db exists\n";
sqlite3 *db;
int open = sqlite3_open_v2("testDB", &db, SQLITE_OPEN_READWRITE, NULL);
if (open == SQLITE_OK) {
std::cout << "db opened\n";
}
else {
std::cout << "Failed to open DB; code: " << open << "\n";
}
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "PRAGMA user_version;", -1, &stmt, NULL);
int dbVersion = 0;
int res = sqlite3_step(stmt);
if (res == SQLITE_ROW) {
dbVersion = sqlite3_column_int(stmt, 0);
}
else {
std::cout << "DB version not set: " << res << " " << sqlite3_errstr(res) << "\n";
}
std::cout << "Database version: " << dbVersion << std::endl;
sqlite3_close(db);
}
Я создал базу данных ("testDB"), которая имеет "pragma user_version = 5;" и находится в той же папке, что и исполняемый файл. Исполняемый файл построен с использованием
g++ sqlite_test.cpp -lsqlite3 -o sqlite_test
Выход:
# ./sqlite_test
db exists
db opened
Database version: 5
# valgrind --tool=callgrind ./sqlite_test
==1184== Callgrind, a call-graph generating cache profiler
==1184== Copyright (C) 2002-2015, and GNU GPL'd, by Josef Weidendorfer et al.
==1184== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==1184== Command: ./sqlite_test
==1184==
==1184== For interactive control, run 'callgrind_control -h'.
db exists
db opened
Database version: 0
==1184==
==1184== Events : Ir
==1184== Collected : 2787290
==1184==
==1184== I refs: 2,787,290
Еще одна вещь, которую я заметил, - это то, что она работает нормально при работе с valgrind (memcheck). Проблема возникает только с callgrind. Это верно как для valgrind 3.12, так и для 3.14.
Обновление:
Очевидно, я должен был упомянуть то, на чем я работаю, потому что это, кажется, источник проблемы.
Моя проблема в системе под управлением Yocto 2.2.2 (Morty) на одноядерном процессоре ARM. Нет проблем, если я запускаю одно и то же на другой системе (которая представляет собой виртуальную машину) под управлением Ubuntu 18.04.
Я не уверен, какая разница между этими системами вызывает проблему.