База данных Sqlite пуста при профилировании с помощью callgrind - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь профилировать программу, для которой требуются данные, загруженные из базы данных 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. Я не уверен, какая разница между этими системами вызывает проблему.

...