Created attachment 123192 [details] The complete build log Hello, after building, the software tests fails. OS: CentOS 7.7 4 - tst_inject (Failed) 4: ------------------------------------------------------------------------------- 4: inject via libc 4: ------------------------------------------------------------------------------- 4: /builddir/build/BUILD/heaptrack-1.1.0/tests/auto/tst_inject.cpp:105 4: ............................................................................... 4: 4: /builddir/build/BUILD/heaptrack-1.1.0/tests/auto/tst_inject.cpp:82: FAILED: 4: REQUIRE( contents.find("\n+") != std::string::npos ) 4: with expansion: 4: 18446744073709551615 (0xffffffffffffffff) 4: != 4: 18446744073709551615 (0xffffffffffffffff) 4: 4: =============================================================================== ------------------------------------------------------------------------------- 4: inject via dlopen 4: ------------------------------------------------------------------------------- 4: /builddir/build/BUILD/heaptrack-1.1.0/tests/auto/tst_inject.cpp:87 4: ............................................................................... 4: 4: /builddir/build/BUILD/heaptrack-1.1.0/tests/auto/tst_inject.cpp:82: FAILED: 4: REQUIRE( contents.find("\n+") != std::string::npos ) 4: with expansion: 4: 18446744073709551615 (0xffffffffffffffff) 4: != 4: 18446744073709551615 (0xffffffffffffffff) 4:
can you try a newer version than 1.1 - i.e. latest git master - and see if it fails there too?
Created attachment 123228 [details] Build log of master
The last master fails before the tests. See the build master attachment. /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.cpp:37:13: error: specialization of 'template<class _Tp> struct std::hash' in different namespace [-fpermissive] struct std::hash<QString> { ^ In file included from /usr/include/c++/4.8.2/bits/basic_string.h:3033:0, from /usr/include/c++/4.8.2/string:52, from /usr/include/c++/4.8.2/random:41, from /usr/include/c++/4.8.2/bits/stl_algo.h:65, from /usr/include/c++/4.8.2/algorithm:62, from /usr/include/qt5/QtCore/qglobal.h:109, from /usr/include/qt5/QtCore/qnamespace.h:43, from /usr/include/qt5/QtCore/qobjectdefs.h:48, from /usr/include/qt5/QtCore/qobject.h:46, from /usr/include/qt5/QtCore/QObject:1, from /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.h:22, from /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.cpp:19: /usr/include/c++/4.8.2/bits/functional_hash.h:58:12: error: from definition of 'template<class _Tp> struct std::hash' [-fpermissive] struct hash; ^ make[2]: *** [src/analyze/gui/CMakeFiles/heaptrack_gui_private.dir/parser.cpp.o] Error 1 make[2]: Leaving directory `/builddir/build/BUILD/heaptrack-master/my_build' make[1]: *** [src/analyze/gui/CMakeFiles/heaptrack_gui_private.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs....
try again, that should be fixed by now, cf. bug 413108
I have tried the last master today, but the result is the same as in comment #3 cd /builddir/build/BUILD/heaptrack-master/my_build/src/analyze/gui && /usr/lib64/ccache/c++ -DKCOREADDONS_LIB -DQT_CORE_LIB -DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_FROM_BYTEARRAY -DQT_NO_CAST_TO_ASCII -DQT_NO_DEBUG -DQT_NO_URL_CAST_FROM_STRING -DQT_USE_QSTRINGBUILDER -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -I/builddir/build/BUILD/heaptrack-master/my_build/src/analyze/gui -I/builddir/build/BUILD/heaptrack-master/src/analyze/gui -I/builddir/build/BUILD/heaptrack-master/my_build/src/analyze/gui/heaptrack_gui_private_autogen/include -I/builddir/build/BUILD/heaptrack-master/src -I/builddir/build/BUILD/heaptrack-master/my_build/src -I/builddir/build/BUILD/heaptrack-master/3rdparty -I/builddir/build/BUILD/heaptrack-master/my_build/src/analyze -isystem /usr/include/KF5/KI18n -isystem /usr/include/KF5 -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtCore -isystem /usr/lib64/qt5/./mkspecs/linux-g++ -isystem /usr/include/KF5/KCoreAddons -isystem /usr/include/KF5/ThreadWeaver -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -std=c++11 -Wall -Wpedantic -std=c++0x -fno-operator-names -fno-exceptions -Wall -Wextra -Wcast-align -Wchar-subscripts -Wformat-security -Wno-long-long -Wpointer-arith -Wundef -Wnon-virtual-dtor -Woverloaded-virtual -Werror=return-type -Wvla -O2 -g -DNDEBUG -fvisibility=hidden -fvisibility-inlines-hidden -Wall -fPIC -std=gnu++11 -o CMakeFiles/heaptrack_gui_private.dir/parser.cpp.o -c /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.cpp In file included from /builddir/build/BUILD/heaptrack-master/my_build/src/analyze/gui/heaptrack_gui_private_autogen/EWIEGA46WW/../../../../../../src/analyze/gui/parser.h:24:0, from /builddir/build/BUILD/heaptrack-master/my_build/src/analyze/gui/heaptrack_gui_private_autogen/EWIEGA46WW/moc_parser.cpp:9, from /builddir/build/BUILD/heaptrack-master/my_build/src/analyze/gui/heaptrack_gui_private_autogen/mocs_compilation.cpp:2: /builddir/build/BUILD/heaptrack-master/my_build/src/analyze/gui/heaptrack_gui_private_autogen/EWIEGA46WW/../../../../../../src/analyze/gui/callercalleemodel.h: In member function 'EntryCost& CallerCalleeEntry::source(const FileLine&)': /builddir/build/BUILD/heaptrack-master/my_build/src/analyze/gui/heaptrack_gui_private_autogen/EWIEGA46WW/../../../../../../src/analyze/gui/callercalleemodel.h:53:47: warning: missing initializer for member 'EntryCost::inclusiveCost' [-Wmissing-field-initializers] it = sourceMap.insert(location, {}); ^ /builddir/build/BUILD/heaptrack-master/my_build/src/analyze/gui/heaptrack_gui_private_autogen/EWIEGA46WW/../../../../../../src/analyze/gui/callercalleemodel.h:53:47: warning: missing initializer for member 'EntryCost::selfCost' [-Wmissing-field-initializers] In file included from /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.h:24:0, from /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.cpp:19: /builddir/build/BUILD/heaptrack-master/src/analyze/gui/callercalleemodel.h: In member function 'EntryCost& CallerCalleeEntry::source(const FileLine&)': /builddir/build/BUILD/heaptrack-master/src/analyze/gui/callercalleemodel.h:53:47: warning: missing initializer for member 'EntryCost::inclusiveCost' [-Wmissing-field-initializers] it = sourceMap.insert(location, {}); ^ /builddir/build/BUILD/heaptrack-master/src/analyze/gui/callercalleemodel.h:53:47: warning: missing initializer for member 'EntryCost::selfCost' [-Wmissing-field-initializers] /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.cpp: At global scope: /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.cpp:37:13: error: specialization of 'template<class _Tp> struct std::hash' in different namespace [-fpermissive] struct std::hash<QString> { ^ In file included from /usr/include/c++/4.8.2/bits/basic_string.h:3033:0, from /usr/include/c++/4.8.2/string:52, from /usr/include/c++/4.8.2/random:41, from /usr/include/c++/4.8.2/bits/stl_algo.h:65, from /usr/include/c++/4.8.2/algorithm:62, from /usr/include/qt5/QtCore/qglobal.h:109, from /usr/include/qt5/QtCore/qnamespace.h:43, from /usr/include/qt5/QtCore/qobjectdefs.h:48, from /usr/include/qt5/QtCore/qobject.h:46, from /usr/include/qt5/QtCore/QObject:1, from /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.h:22, from /builddir/build/BUILD/heaptrack-master/src/analyze/gui/parser.cpp:19: /usr/include/c++/4.8.2/bits/functional_hash.h:58:12: error: from definition of 'template<class _Tp> struct std::hash' [-fpermissive] struct hash; ^ make[2]: *** [src/analyze/gui/CMakeFiles/heaptrack_gui_private.dir/parser.cpp.o] Error 1 make[2]: Leaving directory `/builddir/build/BUILD/heaptrack-master/my_build' make[1]: *** [src/analyze/gui/CMakeFiles/heaptrack_gui_private.dir/all] Error 2 make[1]: Leaving directory `/builddir/build/BUILD/heaptrack-master/my_build' make: *** [all] Error 2
Git commit 47692644c587518b9fc95f7310353a9c5f71cfab by Milian Wolff. Committed on 02/12/2019 at 15:06. Pushed by mwolff into branch 'master'. Fix compile on CentOS 7.7 Explicitly open the std namespace to specialize std::hash. M +5 -2 src/analyze/gui/parser.cpp https://commits.kde.org/heaptrack/47692644c587518b9fc95f7310353a9c5f71cfab
The fix will not work. The source compiles, but the test fails. I tested it with the last master, which contains it: 5: ------------------------------------------------------------------------------- 5: inject via dlopen 5: ------------------------------------------------------------------------------- 5: /builddir/build/BUILD/heaptrack-master/tests/auto/tst_inject.cpp:87 5: ............................................................................... 5: 5: /builddir/build/BUILD/heaptrack-master/tests/auto/tst_inject.cpp:82: FAILED: 5: REQUIRE( contents.find("\n+") != std::string::npos ) 5: with expansion: 5: 18446744073709551615 (0xffffffffffffffff) 5: != 5: 18446744073709551615 (0xffffffffffffffff) 5: 5: ------------------------------------------------------------------------------- 5: inject via libc 5: ------------------------------------------------------------------------------- 5: /builddir/build/BUILD/heaptrack-master/tests/auto/tst_inject.cpp:105 5: ............................................................................... 5: 5: /builddir/build/BUILD/heaptrack-master/tests/auto/tst_inject.cpp:82: FAILED: 5: REQUIRE( contents.find("\n+") != std::string::npos ) 5: with expansion: 5: 18446744073709551615 (0xffffffffffffffff) 5: != 5: 18446744073709551615 (0xffffffffffffffff) 5: 5: =============================================================================== 5: test cases: 2 | 0 passed | 2 failed 5: assertions: 21 | 19 passed | 2 failed 5: 2/5 Test #5: tst_inject .......................***Failed 0.02 sec 2: threads finished
That's very odd - could you please change the code for the test and dump the `contents` variable to stdout? Maybe it's some security feature in CentOS 7.7 that prevents our injector code from working? I'll have to see if I can reproduce this in a docker build of heaptrack for CentOS 7.7, but cannot promise when I get the time for that. cheers
Hi, I have add this code: const auto contents = file.readContents(); std::cerr << "contents is:" << contents << std::endl; REQUIRE(!contents.empty()); ... Now I get this result: 5: Test command: /builddir/build/BUILD/heaptrack-master/my_build/tests/auto/tst_inject 5: Test timeout computed to be: 10000000 1: =============================================================================== 1: All tests passed (785 assertions in 1 test case) 1: 2: start threads 1/5 Test #1: tst_trace ........................ Passed 0.02 sec 5: contents is:v 10250 2 5: x /builddir/build/BUILD/heaptrack-master/my_build/tests/auto/tst_inject 5: X /builddir/build/BUILD/heaptrack-master/my_build/tests/auto/tst_inject 5: I 1000 7c86ce 5: A 5: c 1 5: R 1f8 5: 5: 5: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5: tst_inject is a Catch v1.2.1 host application. 5: Run with -? for options 5: 5: ------------------------------------------------------------------------------- 5: inject via dlopen 5: ------------------------------------------------------------------------------- 5: /builddir/build/BUILD/heaptrack-master/tests/auto/tst_inject.cpp:88 5: ............................................................................... 5: 5: /builddir/build/BUILD/heaptrack-master/tests/auto/tst_inject.cpp:83: FAILED: 5: REQUIRE( contents.find("\n+") != std::string::npos ) 5: with expansion: 5: 18446744073709551615 (0xffffffffffffffff) 5: != 5: 18446744073709551615 (0xffffffffffffffff) 5: 5: contents is:v 10250 2 5: x /builddir/build/BUILD/heaptrack-master/my_build/tests/auto/tst_inject 5: X /builddir/build/BUILD/heaptrack-master/my_build/tests/auto/tst_inject 5: I 1000 7c86ce 5: A 5: c 1 5: R 21e 5: 5: ------------------------------------------------------------------------------- 5: inject via libc 5: ------------------------------------------------------------------------------- 5: /builddir/build/BUILD/heaptrack-master/tests/auto/tst_inject.cpp:106 5: ............................................................................... 5: 5: /builddir/build/BUILD/heaptrack-master/tests/auto/tst_inject.cpp:83: FAILED: 5: REQUIRE( contents.find("\n+") != std::string::npos ) 5: with expansion: 5: 18446744073709551615 (0xffffffffffffffff) 5: != 5: 18446744073709551615 (0xffffffffffffffff) 5: 5: =============================================================================== 5: test cases: 2 | 0 passed | 2 failed 5: assertions: 21 | 19 passed | 2 failed I don't know, if this will help.
it helps in showing that we do setup everything correctly, but then fail to intercept the calls to malloc etc. that centos machine of yours - is it using 64bit or 32bit? do you have any special devtools or other updates installed, or would it be enough for me to just download and install a centos 7.7 docker image to start digging into this?
Just tried it with a centos 7.7 docker image with devtools 7 - the test works there as expected. I would say you either need to provide me with a docker image or virtual machine to reproduce this properly, or otherwise you'll have to spent some time on the heaptrack code yourself to figure out why this test is not properly working for you.
FTR: ``` [root@60d1986599c5 build]# ./tests/auto/tst_inject =============================================================================== All tests passed (23 assertions in 2 test cases) [root@60d1986599c5 build]# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) [root@60d1986599c5 build]# which gcc /opt/rh/devtoolset-7/root/usr/bin/gcc ```
Hi, I use an CentOS7 64 bit VM(KVM) in which the mock tool build the software. This are the compiler flags which are used to build it: + CFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' + export CFLAGS + CXXFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' + export CXXFLAGS + FFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -I/usr/lib64/gfortran/modules' + export FFLAGS + FCFLAGS='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -I/usr/lib64/gfortran/modules' + export FCFLAGS + LDFLAGS='-Wl,-z,relro ' + export LDFLAGS Can some of it, responsible for it?
I don't know mock, nor if the compiler flags are to be blamed. can you try without mock, and without the compiler flags?
Hi Milian, mock is the tool, to build the rpm packages in an clean chroot environment, so that the result will be reproducible. It is used in the RedHat world for build the rpm package from the srpm one. I have tested all compiler options. The "-O2" option will making this problem. But why?
Git commit 33da3a68d899facce613da1e01aed085f1dc10e8 by Milian Wolff. Committed on 07/01/2020 at 12:04. Pushed by mwolff into branch '1.2'. Prevent compiler from optimizing away allocation in tst_inject M +1 -0 tests/CMakeLists.txt M +3 -0 tests/auto/tst_inject.cpp M +2 -5 tests/benchmarks/measure_malloc_overhead.cpp A +35 -0 tests/benchutil.h [License: LGPL (v2.1+)] M +1 -4 tests/manual/test_linkage.c https://commits.kde.org/heaptrack/33da3a68d899facce613da1e01aed085f1dc10e8
Can you try again please? It's quite odd, it seems as if your system compiles the test with -O2 despite the fact that it should be compiled in Debug mode (i.e. with -O0). Anyhow, the patch I pushed just now should hopefully fix it - can you check please?
Now, the current maser compiles on CentOS 7.7. Thanks a lot.