3

valgrind --leak-check=full -v offline

結果:

--6491-- Reading syms from /home/.../offline/offline (0x400000)
--6491-- Reading syms from /lib64/ld-2.11.3.so (0x4000000)
--6491-- Reading syms from /usr/lib64/valgrind/memcheck-amd64-linux (0x38000000)
--6491--    object doesn't have a symbol table
--6491--    object doesn't have a dynamic symbol table
--6491-- Reading suppressions file: /usr/lib64/valgrind/default.supp
--6491-- REDIR: 0x4015fc0 (strlen) redirected to 0x38042017 (???)
--6491-- Reading syms from /usr/lib64/valgrind/vgpreload_core-amd64-linux.so (0x4a20000)
--6491--    object doesn't have a symbol table
--6491-- Reading syms from /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so (0x4c22000)
--6491--    object doesn't have a symbol table
==6491== WARNING: new redirection conflicts with existing -- ignoring it
--6491--     new: 0x04015fc0 (strlen              ) R-> 0x04c26ee0 strlen
--6491-- REDIR: 0x4015f10 (index) redirected to 0x4c26b40 (index)
--6491-- REDIR: 0x4015f90 (strcmp) redirected to 0x4c274e0 (strcmp)
--6491-- Reading syms from /usr/lib64/R/lib/libR.so (0x4e2c000)
--6491-- Reading syms from /usr/lib64/R/lib/libRblas.so (0x543b000)
--6491-- Reading syms from /usr/lib64/R/lib/libRlapack.so (0x5667000)
--6491-- Reading syms from /usr/lib64/R/library/Rcpp/lib/libRcpp.so (0x59e1000)
--6491-- Reading syms from /usr/lib64/R/library/RInside/lib/libRInside.so (0x5c2e000)
--6491-- Reading syms from /home/anisha/qtsdk-2010.05/qt/lib/libQtGui.so.4.7.0 (0x5e43000)
--6491-- Reading syms from /home/anisha/qtsdk-2010.05/qt/lib/libQtCore.so.4.7.0 (0x6bc0000)
--6491-- Reading syms from /lib64/libpthread-2.11.3.so (0x70a3000)
--6491-- Reading syms from /usr/lib64/libstdc++.so.6.0.14 (0x72c0000)
--6491--    object doesn't have a symbol table
--6491-- Reading syms from /lib64/libm-2.11.3.so (0x75c9000)
--6491-- Reading syms from /lib64/libgcc_s.so.1 (0x7820000)
--6491--   Considering /usr/lib/debug/.build-id/e6/eb8011838a065946e5808e036550844548379f.debug ..
--6491--   .. build-id is valid
--6491-- Reading syms from /lib64/libc-2.11.3.so (0x7a36000)
--6491-- Reading syms from /lib64/libreadline.so.6.1 (0x7da3000)
--6491--    object doesn't have a symbol table
--6491-- Reading syms from /lib64/librt-2.11.3.so (0x7fea000)
--6491-- Reading syms from /lib64/libdl-2.11.3.so (0x81f3000)
--6491-- Reading syms from /usr/lib64/libgomp.so.1.0.0 (0x83f7000)



==6491== 5 errors in context 13 of 34:
==6491== Conditional jump or move depends on uninitialised value(s)
==6491==    at 0x611629E: QHash<unsigned int, int>::findNode(unsigned int const&, unsigned int*) const (../include/QtCore/../../src/corelib/tools/qhash.h:884)
==6491==    by 0x62E9AC6: QTextFormatCollection::indexForFormat(QTextFormat const&) (../include/QtCore/../../src/corelib/tools/qhash.h:865)
==6491==    by 0x62E9E51: QTextFormatCollection::createObjectIndex(QTextFormat const&) (/var/tmp/qt-src/src/gui/text/qtextformat.cpp:3142)
==6491==    by 0x62FF56E: QTextDocumentPrivate::createObject(QTextFormat const&, int) (/var/tmp/qt-src/src/gui/text/qtextdocument_p.cpp:1588)
==6491==    by 0x62FFD57: QTextDocumentPrivate::rootFrame() const (/var/tmp/qt-src/src/gui/text/qtextdocument_p.cpp:1407)
==6491==    by 0x63203B0: QTextDocumentLayout::doLayout(int, int, int) (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:2908)
==6491==    by 0x632051C: QTextDocumentLayoutPrivate::ensureLayoutedByPosition(int) const (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:3076)
==6491==    by 0x6320978: QTextDocumentLayoutPrivate::layoutStep() const (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:3082)
==6491==    by 0x632123C: QTextDocumentLayout::documentChanged(int, int, int) (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:2874)
==6491==    by 0x62EF7D3: QTextDocument::documentLayout() const (/var/tmp/qt-src/src/gui/text/qtextdocument.cpp:1070)
==6491==    by 0x62C0D36: QTextControlPrivate::_q_documentLayoutChanged() (/var/tmp/qt-src/src/gui/text/qtextcontrol.cpp:624)
==6491==    by 0x62C104E: QTextControlPrivate::setContent(Qt::TextFormat, QString const&, QTextDocument*) (/var/tmp/qt-src/src/gui/text/qtextcontrol.cpp:434)


==6491== 3 errors in context 10 of 34:
==6491== Use of uninitialised value of size 8
==6491==    at 0x6116276: QHash<unsigned int, int>::findNode(unsigned int const&, unsigned int*) const (../include/QtCore/../../src/corelib/tools/qhash.h:884)
==6491==    by 0x62E9AC6: QTextFormatCollection::indexForFormat(QTextFormat const&) (../include/QtCore/../../src/corelib/tools/qhash.h:865)
==6491==    by 0x62E9E51: QTextFormatCollection::createObjectIndex(QTextFormat const&) (/var/tmp/qt-src/src/gui/text/qtextformat.cpp:3142)
==6491==    by 0x62FF56E: QTextDocumentPrivate::createObject(QTextFormat const&, int) (/var/tmp/qt-src/src/gui/text/qtextdocument_p.cpp:1588)
==6491==    by 0x62FFD57: QTextDocumentPrivate::rootFrame() const (/var/tmp/qt-src/src/gui/text/qtextdocument_p.cpp:1407)
==6491==    by 0x63203B0: QTextDocumentLayout::doLayout(int, int, int) (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:2908)
==6491==    by 0x632051C: QTextDocumentLayoutPrivate::ensureLayoutedByPosition(int) const (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:3076)
==6491==    by 0x6320978: QTextDocumentLayoutPrivate::layoutStep() const (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:3082)
==6491==    by 0x632123C: QTextDocumentLayout::documentChanged(int, int, int) (/var/tmp/qt-src/src/gui/text/qtextdocumentlayout.cpp:2874)
==6491==    by 0x62EF7D3: QTextDocument::documentLayout() const (/var/tmp/qt-src/src/gui/text/qtextdocument.cpp:1070)
==6491==    by 0x62C0D36: QTextControlPrivate::_q_documentLayoutChanged() (/var/tmp/qt-src/src/gui/text/qtextcontrol.cpp:624)
==6491==    by 0x62C104E: QTextControlPrivate::setContent(Qt::TextFormat, QString const&, QTextDocument*) (/var/tmp/qt-src/src/gui/text/qtextcontrol.cpp:434)

==6491== ERROR SUMMARY: 52 errors from 34 contexts (suppressed: 18 from 8)

これらのエラーはどれもソース ファイルを指していません。
心配する必要がありますか?

Makefile は qmake によって自動生成されます。
-Wall が含まれています。

CC = gcc
CXX = g++
DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
CFLAGS = -m64 -pipe -O2 -Wall -g -pedantic -W -D_REENTRANT $(DEFINES)

Makeは私に警告を表示しません。

4

2 に答える 2

3

次のオプションは、いくつかのヒントを得るのに役立ちました (Valgrind の man ページからのテキスト)。

  • --num-callers

プログラムの場所を識別するスタック トレースに表示されるエントリの最大数を指定します。エラーは、上位 4 つの関数の場所 (現在の関数内の場所と、その 3 つの直接の呼び出し元の場所) のみを使用して一般化されることに注意してください。したがって、これは報告されたエラーの総数には影響しません。

これの最大値は 50 です。設定を高くすると、Valgrind の実行が少し遅くなり、メモリの消費量が少し増えますが、呼び出しチェーンが深くネストされたプログラムで作業する場合に役立ちます。

  • --fullpath-after

デフォルトでは、Valgrind はスタック トレースにファイル名のみを表示し、ソース ファイルへのフル パスは表示しません。ソースが複数の異なるディレクトリに存在する大規模なプロジェクトで Valgrind を使用する場合、これは不便な場合があります。--fullpath-after は、この問題に対する柔軟なソリューションを提供します。このオプションが存在する場合、各ソース ファイルへのパスが表示されます。

  • --track-origins=yes

Memcheck が初期化されていない値の起源を追跡するかどうかを制御します。つまり、初期化されていない値が危険な方法で使用されていることはわかりますが、初期化されていない値がどこから来たのかはわかりません。これにより、根本的な問題を追跡することが困難になることがよくあります。

于 2012-12-05T10:02:54.990 に答える
2

心配する必要がありますか?

はい。ドキュメントで説明されている契約を尊重しない引数を渡すことにより、Qt の関数を間違って使用している可能性があります。

memcpy()次のような標準ライブラリを使用したとします。

char t[10];
memcpy(t, ..., 12);

Valgrind は のバッファ オーバーフローにフラグを立てますmemcpy()memcpy()、この場合は責任を負いません。代わりに、 の呼び出し元がmemcpy()間違って使用しています。

ここでは、初期化されていないメモリへのポインターを、それらから読み取ることができると予想される Qt 関数に渡している可能性があります。Qt関数が指定されたメモリからの読み取りとして文書化されている場合、それはプログラムに問題があることを意味します.

編集:

同様に、障害のある関数の直接の呼び出し元が真の犯人ではない可能性があります。間違った引数を受け取ってそれ自体がトリップした可能性があります。実際には、プログラミング エラーは、Valgrind が問題を検出した時点で最新のコール スタックのどこかにあります。機能の要件と保証について考えるように促すプログラミング方法論である「デザイン・バイ・コントラクト」では、これを「責任の割り当て」と呼びます。

于 2012-12-05T08:44:36.390 に答える