valgrindのは:プラットフォーム "のx86 Linuxのためのツール「memcheck」を開始できませんでした

1このエラーを取得、開発者の生活の中で時間が来る
valgrindのは: "のx86 Linuxのプラットフォーム用のツール「memcheck」を開始できませんでした

私は専門家Valgrindはユーザーとして自分自身を見ていないが、私は私のCプログラムでメモリリークをキャッチするのに十分なValgrindのの出力を理解しています。

先日私は、アセンブリ言語で個人的なプロジェクトを立ち上げ、そのための標準的なCメモリルーチン(のcalloc、reallocの、自由を)使用
メモリ要件。このプログラムは、複雑な成長し、私は任意のメモリをリークするわけではない(とも私は確かに確かになりたかった
私はその段階で漏れています知っているどこメモリリーク-開発の中で)、また、どのように見るために好奇心によるものでしたうまく
Valgrindのは、アセンブリで書かれたプログラムを処理していました。結局、私は、任意の言語で書かれたプログラムのために前のValgrindを使用したことがありませんでしたしている
C.以外の

だから私はそうのようなValgrindのを立ち上げ、そのエラーました-完全に予想外の:
$
$ valgrindの./atail32_80 test.txtという
valgrindのを:そのようなファイルまたはディレクトリ:プラットフォームのためのツール「memcheck」 'のx86 Linuxの起動に失敗した
$の
思想交差したことがないがそして、私はそれで正しい軌道に乗っていた-エラーはアセンブリ言語のフロントエンドによるものであったことを私の心!

私は、エラーがデバッグ対象プログラムは、64ビットプラットフォーム上の32ビットプログラム*であったという事実によるものであったと仮定し
(下記参照します)。
$
$は、uname -i
x86_64版

$ファイル./atail32_80
./atail32_80:ELF 32ビットLSB実行、インテル80386、バージョン1(SYSV)は、動的にリンクされたが
(共有ライブラリを使用)、GNU / Linuxの2.6.32、BuildID [SHA1] = 0xf3e3af4712a9382cb2b793f580a26a6797d64d1fため、剥離しません
の$
* Iは、(それについてさらなる議論はこの記事とは無関係になります)目的に、32ビットの実行可能ファイルとして、そのプログラムを構築しました。

私は、捜査のコンソールを立ち上げ、私の仮説を確認するために、この小さな実験を行いました。
$ "ボイドメイン(){}"> testme.cエコー
$
$ GCC -m32 -o testme32 testme.c
$
$ GCC -m64 -o testme64 testme.c
の$
$ファイルtestme32
ELF 32ビットLSB実行、インテル:testme32を80386、動的にリンクされたバージョン1(SYSV)は、(共有使用しLIBS)、GNU / Linuxの2.6.32ため、BuildIDは[SHA1] = 0x305f621662204c0289ee57e927c0221af84e4597、剥がさない
の$
$ファイルtestme64
testme64:ELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)、動的にリンクされた(共有ライブラリを使用)、GNU / Linuxの2.6.32ため、BuildIDは[SHA1] = 0x285da18d5e71346dfd958b260fccfe3717cd2b99は、剥離しない
$
$ valgrindの./testme64
== 28701 == Memcheck、メモリエラー検出
== 28701 ==著作権(C)2002から2012、およびGNU GPLに、ジュリアンスワードらによる。
== 28701 == Valgrindの-3.8.1とLibVEXを使用しました。著作権情報について-hと再実行
== 28701 ==コマンド:./testme64
== 28701 ==
== 28701 ==
== 28701 == HEAP概要:
出口で使用されている== 28701 ==:0ブロックで0バイト
== 28701 ==合計ヒープ使用量:0 allocs、0解放し、0バイト割り当て
== 28701 ==
== 28701 ==すべてのヒープブロックは解放された-ない漏れが不可能である
== 28701 ==
== 28701 ==について-v:で再実行検出及び抑制エラーのカウント、
== 28701 == ERROR概要:0コンテキストから0エラー(抑制:2から2)
$
$ valgrindの./testme32
valgrindの:プラットフォームのためのツール「memcheck」 'のx86 Linuxの起動に失敗しました:そのようなファイルやディレクトリはありませんに
、エラーの原因を確認した上で、最後の行に同じエラーメッセージを。しかし、実際に何が起こったのか?

いくつかのツールを知ることができます。straceのは、現時点で正しいものを言っていたように見えました。
$
$ straceの-eトレース=ファイルvalgrindの./testme32
はexecve( "は/ usr / binに/ valgrindの"、[ "valgrindの"、」./testme32 "]、[/ * 67 VARS * /])= 0
アクセス(" /など/ ld.so.preload "R_OK)= -1 ENOENT(そのようなファイルまたはディレクトリ)
オープン( "は/ etc / ld.so.cache"、O_RDONLY | O_CLOEXEC)= 3
オープン(" / lib64に/ libc.so 0.6" 、O_RDONLY | O_CLOEXEC)= 3
オープン( "./ testme32" 、O_RDONLY)= 3
READLINK( "/ procの/自己/ exeファイル"、 "は/ usr / binに/ valgrindの"、4096)= 17
はexecve(" / USR / lib64に/ valgrindの/ memcheck-x86ベースのLinux "[ "valgrindの"、" ./testme32" ]、[/ * 68 VARS * /)= -1 ENOENT(そのようなファイルまたはディレクトリ)
valgrindの:
+++ +++は1で終了しました
$
、それが今、私たちによく知られているだけで、エラーメッセージの上にはexecve()ライン、それを離れています。Valgrindのは、起動しようとしている
欠けているように見えるの/ usr / lib64に/ valgrindの/ memcheck-x86ベースのLinuxを。

私たちは確認してみましょう:
$
$ lsのは/ usr / lib64に/ valgrindの/ memcheck *
は/ usr / lib64に/ valgrindの/ memcheck-AMD64-linuxのは/ usr / lib64に/ valgrindの/ memcheck-x86ベースのLinux
$
それがあります!しかし、ファイルがあります-とValgrindのが期待する非常に場所で!そして、なぜ失敗?

締結前に、待って、上のことを思い出してください「疑いで、シンボリックリンクを考えるとき、」NIX、我々はすべて、いずれかのハードやソフトの方法を学びました。
これらの行の場合:
$
$のCDの/ usr / lib64に/ valgrindの/
$
$ PWD
は/ usr / lib64に/ valgrindの
$
$のls -l memcheck

-rwxr-XR-X。1つのルートルート3449056 2013年4月25日memcheck-AMD64-Linuxの
lrwxrwxrwx。1つのルートルート37 6月10日4時42分memcheck-x86ベースのLinux - > ../../lib/valgrind/memcheck-x86-linux
$
$のls -l ../../lib/valgrind/memcheck-x86- Linuxの
lsが:そのようなファイルまたはディレクトリ:../../lib/valgrind/memcheck-x86-linuxアクセスすることはできません
$
だから、memcheck-86-Linuxは確かにシンボリックリンクである、との目標が欠落しています。

さらに見ると、私たちは、そのシンボリックリンクは/ usr / lib64に/ valgrindの/ memcheck-x86ベースのLinuxは、Valgrindのパッケージに属して/によって作成されたことを確認することができます。
そこには驚きません!
$
$ yumのは/ usr / lib64に/ valgrindの/ memcheck-のx86-linuxの提供
ロードプラグイン:langpacks、リフレッシュ-PackageKitの
グーグル・クローム/ filelistに|を 1.8 kBの夜12時○○分00秒
1:valgrindの-3.8.1-15.fc19.x86_64:プログラムでメモリ管理のバグを発見するためのツール
レポ:フェドーラ
:からマッチした
ファイル名:は/ usr / lib64に/ valgrindの/ memcheck-x86ベースのLinux

1:valgrindの-3.8.1-15.fc19.x86_64:プログラムでメモリ管理のバグを発見するためのツール
レポ:インストール
からマッチ:
ファイル名:は/ usr / lib64に/ valgrindの/ memcheck-x86ベースのLinux
$

さらに掘り、私たちはvalgrind.x86_64によって作成された2つのmemcheck *シンボリックリンクが壊れていることがわかります。
$の
$回転数-ql valgrindの| grepのmemcheck
は/ usr / lib64に/ valgrindの/ memcheck-AMD64-のLinux
の/ usr / lib64に/ valgrindの/ memcheck-x86ベースのLinux
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so
の/ usr / lib64に/ valgrindの/ vgpreload_memcheck-x86の-linux.so
$
$
$のrpm -qlのvalgrindの| グレップのmemcheck | xargsのファイル
は/ usr / lib64に/ valgrindの/ memcheck-AMD64-のLinux:ELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)、静的にリンクされ、BuildID [SHA1] = 0x82b75aa9e8494556aa050869e5e7ed20e9522137、剥離
の/ usr / lib64に/ valgrindの/ memcheck-のx86-Linuxは:へのシンボリックリンクを壊れ../../lib/valgrind/memcheck-x86-linux' /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xdd994ac2a32bece59363fadc2003e49a1b8c3539, stripped /usr/lib64/valgrind/vgpreload_memcheck-x86-linux.so: broken symbolic link to../ ..
「/lib/valgrind/vgpreload_memcheck-x86-linux.so
$

私たちは遠征を継続し、他のValgrindのパッケージはそれはおそらく見つからないファイルにもたらす可能性があるかについて調べるみましょう
:これらのシンボリックリンクが指している
$
$ yumをリストvalgrindの*
、langpacksリフレッシュ-でPackageKit:ロードされたプラグインが
インストール済みパッケージ
valgrind.x86_64 1 :3.8.1-15.fc19インストール
可能なパッケージ
valgrind.i686 1:3.8.1-15.fc19 Fedoraの
valgrindの-devel.i686 1:3.8.1-15.fc19 Fedoraの
valgrindの-devel.x86_64 1:3.8.1- 15.fc19 Fedoraの
valgrindの-openmpi.x86_64 1:3.8.1-15.fc19フェドーラ
$
我々がシステムにインストールされ、64ビットValgrindはパッケージ、および32ビットのカウンタを持っていることは明らかであるValgrindのパッケージの一部が利用可能です(ただし、
)システムにインストールされていません。

私の問題を解決するには、手の届く範囲内と思われる-パッケージvalgrind.i686をインストールしてください
しかし、私はそのパッケージをインストールする前に、二つのことを確認したいです。

(a)はvalgrind.i686は、(少なくとも)これら二つの不足しているファイルを持ち込むだろう

(b)はvalgrind.i686は、32ビット版で重要なvalgrindのバイナリを上書きして、私の64ビット実行可能ファイルのテストを中断されません。

私たちは、(a)第1確認してみましょう:
$
$ repoquery -l valgrind.i686 | grepのmemcheck
は/ usr / libに/ valgrindの/ memcheck-x86ベースのLinux
/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so
$
確かに、これら二つの壊れたシンボリックリンクのターゲットは、これらの2つのファイルのパスとファイル名と一致します。
これは、不足しているファイルにvalgrind.i686もたらすことが確認されます。

:今、(b)は、私たちが確認してみましょう
$
| $ repoquery -l valgrind.x86_64 grepのビン
は/ usr / binに/ callgrind_annotate
は/ usr / binに/ callgrind_control
は/ usr / binに/ cg_annotate
は/ usr / binに/ cg_diff
は/ usr / binに/ cg_merge
は/ usr / binに/ ms_print
は/ usr / binに/ valgrindの
は/ usr / binに/ valgrindの-listener
は/ usr / binに/ vgdb
$
$ repoquery -l valgrind.i686 | grepのビン
は/ usr / binに/ callgrind_annotate
は/ usr / binに/ callgrind_control
は/ usr / binに/ cg_annotate
は/ usr / binに/ cg_diff
は/ usr / binに/ cg_merge
は/ usr / binに/ ms_print
は/ usr / binに/ valgrindの
は/ usr / binに/ valgrindの-listener
は/ usr / binに/ vgdb
$
$ repoquery -l valgrind.x86_64 | grepのビン| xargsのファイル
は/ usr / binに/ callgrind_annotate:Perlスクリプト、ASCIIテキスト、実行
は/ usr / binに/ callgrind_control:Perlスクリプト、ASCIIテキスト、実行
は/ usr / binに/ cg_annotate:Perlスクリプト、ASCIIテキスト、実行
は/ usr / binに/ cg_diff:Perlスクリプト、ASCIIテキスト、実行
の/ usr / binに/ cg_merge:ELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)は、動的にリンクされた(共有ライブラリを使用)、GNU / Linuxの2.6.32、BuildID [SHA1] = 0x5228b41ce865c922a7948698c40a6ed1b7c7cf1c用、ストリッピング
は/ usr / binに/ ms_printを:Perlスクリプト、ASCIIテキスト、実行
の/ usr / binに/ valgrindの:ELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)、動的にリンクされた(共有ライブラリを使用)、GNUのために/剥奪のLinux 2.6.32、BuildID [SHA1] = 0x19186524e13c9eaaacdc8bec0144b3d82bb0800a、
/ usr / binに/ valgrindのリスナー:GNU / Linuxの2.6.32用のELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)、動的にリンクされた(共有ライブラリを使用)、BuildID [SHA1] = 0x5c9a1aa7055c71fcb7cab739509940deb4594464、ストリッピング
/ usr / binに/ vgdb:ELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)、動的にリンクされたが(共有ライブラリを使用)、GNU / Linuxの2.6.32ため、BuildID [SHA1] = 0xcbcdb0a010739b8ebfbff0abd508683987646c30は、剥離
$
それを問題のように思えます。
バイナリファイルの4つのうちの64ビットと32ビットバージョンとの間の重複の実行可能ファイルがあります。
私は推定 - 最悪の場合、32ビットパッケージは、64ビットの実行可能ファイルのテストを破る、予想通り、これらのバイナリファイルを上書きしてしまいます。しかしダメージは二つのステップで簡単にリバーシブルになります:(a)のアンインストールvalgrind.i686(b)はvalgrind.x86_64を再インストールします

そのことを私は計画を上突入する準備ができていた - 物事が壊れた場合、私は、これら二つのシンボリックリンクのターゲットファイルのコピーを作成し、32ビットのパッケージをアンインストールし、64ビットパッケージを再インストールし、最後に手動で修正するために壊れたシンボリックリンクを復元するだろう問題は、私はもともとで開始しました。

だから私は(sudoのyumをvalgrind.i686をインストール)しました、そして、それはそう起こるように、valgrind.i686は、64ビットの実行可能ファイルを上書きしません。
$
$回転数-ql valgrind.i686 | grepのビン| xargsのファイル
は/ usr / binに/ callgrind_annotate:Perlスクリプト、ASCIIテキスト、実行
は/ usr / binに/ callgrind_control:Perlスクリプト、ASCIIテキスト、実行
は/ usr / binに/ cg_annotate:Perlスクリプト、ASCIIテキスト、実行
は/ usr / binに/ cg_diff:Perlスクリプト、ASCIIテキスト、実行
の/ usr / binに/ cg_merge:ELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)は、動的にリンクされた(共有ライブラリを使用)、GNU / Linuxの2.6.32、BuildID [SHA1] = 0x5228b41ce865c922a7948698c40a6ed1b7c7cf1c用、剥奪
は/ usr / binに/ ms_print:Perlスクリプト、ASCIIテキスト、実行可能
/ usr / binに/ valgrindの:GNU / Linuxの2.6.32、BuildID [SHA1] = 0x19186524e13c9eaaacdc8bec0144b3d82bb0800a用ELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)、動的にリンクされた(共有ライブラリを使用)、剥離
USR / / binに/ valgrindのリスナー:ELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)、動的にリンクされたが(共有ライブラリを使用)、GNU / Linuxの2.6.32ため、BuildIDは[SHA1] = 0x5c9a1aa7055c71fcb7cab739509940deb4594464、剥離
USR / / binに/ vgdb:ELF 64ビットLSBの実行、x86-64で、バージョン1(SYSV)、動的にリンクされたが(共有ライブラリを使用しています)、GNU / Linuxの2.6.32のために、BuildID [SHA1] = 0xcbcdb0a010739b8ebfbff0abd508683987646c30は、取り除か
$を
、私はできませんこのパッケージの.rpmの包装スクリプトロジックに見もせず、この段階では、この動作を説明します。

予想通り、残りがあれば、私たちは見てみましょう。私たちは、壊れたシンボリックリンクが修復されていることを確認してみましょう:
$
$のrpm -ql valgrind.x86_64を| グレップのmemcheck | xargsのファイル
は/ usr / lib64に/ valgrindの/ memcheck-AMD64-のLinux:ELF 64ビットLSB実行、x86-64で、バージョン1(SYSV)、静的にリンクされ、BuildID [SHA1] = 0x82b75aa9e8494556aa050869e5e7ed20e9522137、剥離
の/ usr / lib64に/ valgrindの/ memcheck-x86ベースのLinux:シンボリックリンクする../../lib/valgrind/memcheck-x86-linux' /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0xdd994ac2a32bece59363fadc2003e49a1b8c3539, stripped /usr/lib64/valgrind/vgpreload_memcheck-x86-linux.so: symbolic link to「../../lib/valgrind/vgpreload_memcheck-x86-linux.so
$
彼らは確かに。

さて、あなたのような私はvalgrindのは、(64ビットの実行可能ファイルのテストを壊すことなく)今32ビットの実行可能ファイルをテストすることができるかどうかを確認するに興味があった:
$
$ valgrindの./testme32
== 7914 == Memcheck、メモリエラー検出器
== 7914 ==ジュリアンスワードらによる著作権(C)2002から2012、およびGNU GPLに、。
Valgrindの-3.8.1とLibVEXを使用した== 7914 ==; 著作権情報について-hと再実行
== 7914 ==コマンド:./testme32
== 7914 ==
== 7914 ==
== 7914 == HEAP概要:
出口で使用中== 7914 == 0ブロックで0バイト
== 7914 ==合計ヒープ使用量:0 allocs、0解放し、0バイト割り当て
== 7914 ==
== 7914 ==すべてのヒープブロックは解放された-ない漏れが不可能である
== 7914 ==
-v:検出されたエラーを抑制するカウントと再実行について== 7914 ==
== 7914 == ERROR概要:0コンテキストから0エラー(抑制:0から0)
$
$ valgrindの./testme64
== 8176 == Memcheck 、メモリエラー検出
ジュリアンスワードらによる== 8176 ==著作権(C)2002から2012、およびGNU GPLに、。
Valgrindの-3.8.1とLibVEXを使用した== 8176 ==; 著作権情報について-hと再実行
== 8176 ==コマンド:./testme64
== 8176 ==
== 8176 ==
== 8176 == HEAP概要:
出口で使用中== 8176 == 0ブロックで0バイト
== 8176 ==合計ヒープ使用量:0 allocs、0解放し、0バイト割り当て
== 8176 ==
== 8176 ==すべてのヒープブロックは解放された-ない漏れが不可能である
== 8176 ==
==検出されたと、して再実行し、エラーを抑えのカウントのために8176 ==:-v
== 8176 == ERROR概要:0コンテキストから0エラー(抑制:2から2)
$
グッド。64ビットならびに32ビットの実行可能ファイル:valgrindのは今の両方をテストすることが可能です。

$ valgrindの./atail32_80あるtest.txt

== 13468 ==
== 13468 == HEAP概要:
出口での使用において== 13468 ==:10のブロック266バイト
== 13468 ==合計ヒープ使用量:18のallocs、8つの解放し、623バイトが割り当て
== 13468 = =
== 13468 ==リーク概要:
間違いなく失わ== 13468 ==:9つのブロックで262のバイト

予期しないメモリのカップルと一緒に、最初の実行時に予想されるメモリリークをキャッチしましたvalgrindのと私のプロジェクトのバイナリをテスト
アクセス関連のバグ(ここでは示されていません)。今ではいくつかの時間のために忙しい私を維持しようとしています。

以下のいずれかのコメント/提案を残します。

19:58のでBijal Thanawala投稿者
メールで
送信BlogThis!
Twitterでの共有
Facebookで共有する
Pinterestののに共有
ラベル:デバッグ、開発、メモリリークは、rpm、straceの、valgrindの、yumは
ありませんコメント:
コメントを投稿

新しい投稿前の投稿ホーム
登録:コメントの投稿(Atomが)
ラベル
のyum開発のLinuxビルドカーネルのMakefileのコマンドラインデバッグメモリリークRM回転数straceのをvalgrindのバージョンを

Bijal Thanawalaは
私の完全なプロファイルを見る
素晴らしいInc.のテーマを。ブロガーによって供給。

https://algounirhythmverse.blogspot.com/2015/09/valgrind-failed-to-start-tool-memcheck.html?m=1

おすすめ

転載: www.cnblogs.com/ims-/p/11427522.html