Google Benchmark zum laufen bringen



  • Hallo,
    ich habe vor kurzem den Vortrag von Chandler Carruth zum Thema Tuning C++ auf Youtube gesehen und wollte das Framework mal selber ausprobieren, bekomme es aber nicht hin. Mein Beispielprogram kompiliert zwar, aber wenn ich es starte, dann bekomme ich einen Segmentation fault. Daher wollte ich hier mal Fragen, ob ihr wisst was ich hier falsch gemacht habe. Ich hoffe es ist hier das richtige Unterforum.

    Ich erläutere mal meine Schritte, welche ich durchgeführt habe um eine kleine Beispielanwendung zu erstellen:

    1. Das Framework von der Github Seite heruntergeladen, entpackt, mit cmake -G "Unix Makefiles" das makefile angelegt und mit make gebaut.

    2. den Ordner include und die statische Bibliothek libbenchmark.a kopiert und in meinen projektordner eingefügt.

    3. mein Beispielprogram sieht wie folgt aus:

    #include <string>
    #include "benchmark.h"
    
    static void BM_StringCreation(benchmark::State& state) {
      while (state.KeepRunning()) 
        std::string empty_string;
    }
    
    BENCHMARK(BM_StringCreation);
    
    BENCHMARK_MAIN();
    

    4. Kompiliert habe ich mit folgendem Befehl:

    g++ -std=c++14 -Wall -I./lib/include/benchmark -O3 ./src/*.cpp -o main -L./lib -lbenchmark -static -pthread
    

    Beste Grüße 🙂



  • Ich nehme mal an, es geht um die Library hier, oder?
    https://github.com/google/benchmark

    Kann deinen Fehler reproduzieren. Hast du das ganze schonmal durch einen Debugger gejagt?

    terminate called after throwing an instance of 'std::system_error'
      what():  Unknown error -1
    
    Program received signal SIGABRT, Aborted.
    0x00000000004fdb09 in raise ()
    (gdb) bt
    #0  0x00000000004fdb09 in raise ()
    #1  0x000000000048b7a8 in abort ()
    #2  0x0000000000444285 in __gnu_cxx::__verbose_terminate_handler() ()
    #3  0x0000000000417676 in __cxxabiv1::__terminate(void (*)()) ()
    #4  0x00000000004176a3 in std::terminate() ()
    #5  0x0000000000417852 in __cxa_throw ()
    #6  0x0000000000435e80 in std::__throw_system_error(int) ()
    #7  0x0000000000415d2e in void std::call_once<void (&)()>(std::once_flag&, void (&)()) ()
    #8  0x0000000000415a46 in benchmark::NumCPUs() ()
    #9  0x0000000000415a74 in benchmark::CpuScalingEnabled() ()
    #10 0x00000000004165f9 in benchmark::walltime::(anonymous namespace)::UseCpuCycleClock() ()
    #11 0x00000000004166be in benchmark::walltime::Now() ()
    #12 0x000000000040608e in benchmark::Initialize(int*, char**) ()
    #13 0x0000000000402338 in main (argc=1, argv=0x7fffffffe648) at main.cpp:11
    (gdb)
    

    Wenn der Sample-Code nicht funktioniert, sieht das nach einem Bug in der Library aus. Wenn es kein Bug in der Library sondern ein Fehler beim Build ist, ist es ein Doku-Bug in der Library und die Maintainer sollten funktionierende Build-Optionen in die README packen.


Log in to reply