2012-04-13 12 views
4

マルチコアマシン上で動作するマルチスレッドプログラム(LinuxプラットフォームでPthreadを使用してCで実装されています)があります。私は--memcheckオプションでValGrindを使用して、自分のコードでいくつかのメモリの問題を発見しています。しかし、それはハングアップします。問題の完全な概要を説明するために、ここに背景があります。マルチスレッドプログラムをプロファイルするためにValgrindがハングする

コードには、初期化の一部として開始時にいくつかのシーケンシャルパーツがあり、後で(Pthread APIを使用して)8つのスレッドが作成され、ラングが完了します。私のコードはいつか "コア"をダンプします。私はGDBを使用しました。次のトレースを示します。私はそれは問題が存在する正確なコードの位置を与えるものではありません-gオプションなしOフラグを使用しますが

======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6[0xb7cd47cd] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb7cd7e30] 
/home/kumar/CycleSim/slack_cp/sim-outorder[0x819a6c9] 
/home/kumar/CycleSim/slack_cp/sim-outorder[0x8167e3e] 
/home/kumar/CycleSim/slack_cp/sim-outorder[0x804f5e4] 
/lib/tls/i686/cmov/libpthread.so.0[0xb7f8c31b] 
/lib/tls/i686/cmov/libc.so.6(clone+0x5e)[0xb7d3c57e] 
======= Memory map: ======== 
08048000-081b5000 r-xp 00000000 08:11 11813248 
/home/kumar/CycleSim/slack_cp/sim-outorder 
081b5000-081b8000 rw-p 0016c000 08:11 11813248 
/home/kumar/CycleSim/slack_cp/sim-outorder 
081b8000-08549000 rw-p 081b8000 00:00 0   [heap] 
ab9fd000-ab9fe000 ---p ab9fd000 00:00 0 
ab9fe000-ac1fe000 rw-p ab9fe000 00:00 0 
ac1fe000-ac1ff000 ---p ac1fe000 00:00 0 
ac1ff000-ac9ff000 rw-p ac1ff000 00:00 0 
ac9ff000-aca00000 ---p ac9ff000 00:00 0 
aca00000-ad2cb000 rw-p aca00000 00:00 0 
ad2cb000-ad300000 ---p ad2cb000 00:00 0 
ad3bf000-ad3c0000 ---p ad3bf000 00:00 0 
ad3c0000-adbc0000 rw-p ad3c0000 00:00 0 
adbc0000-adbc1000 ---p adbc0000 00:00 0 
adbc1000-ae3c1000 rw-p adbc1000 00:00 0 
ae3c1000-ae3c2000 ---p ae3c1000 00:00 0 
ae3c2000-aebc2000 rw-p ae3c2000 00:00 0 
aebc2000-aebc3000 ---p aebc2000 00:00 0 
aebc3000-b2e7d000 rw-p aebc3000 00:00 0 
b2e7d000-b2e7e000 ---p b2e7d000 00:00 0 
b2e7e000-b367e000 rw-p b2e7e000 00:00 0 
b367e000-b367f000 ---p b367e000 00:00 0 
b367f000-b7c6d000 rw-p b367f000 00:00 0 
b7c6d000-b7da8000 r-xp 00000000 08:01 12895490 /lib/tls/i686/cmov/libc-2.5.so 
b7da8000-b7da9000 r--p 0013b000 08:01 12895490 /lib/tls/i686/cmov/libc-2.5.so 
b7da9000-b7dab000 rw-p 0013c000 08:01 12895490 /lib/tls/i686/cmov/libc-2.5.so 
b7dab000-b7dae000 rw-p b7dab000 00:00 0 
b7dae000-b7dde000 r-xp 00000000 08:21 3828021 /usr/lib/libgslcblas.so.0.0.0 
b7dde000-b7ddf000 rw-p 0002f000 08:21 3828021 /usr/lib/libgslcblas.so.0.0.0 
b7ddf000-b7f7d000 r-xp 00000000 08:21 3828022 /usr/lib/libgsl.so.0.9.0 
b7f7d000-b7f87000 rw-p 0019d000 08:21 3828022 /usr/lib/libgsl.so.0.9.0 
b7f87000-b7f9a000 r-xp 00000000 08:01 12895516 
/lib/tls/i686/cmov/libpthread-2.5.so 
b7f9a000-b7f9c000 rw-p 00013000 08:01 12895516 
/lib/tls/i686/cmov/libpthread-2.5.so 
b7f9c000-b7f9f000 rw-p b7f9c000 00:00 0 
b7f9f000-b7fc4000 r-xp 00000000 08:01 12895498 /lib/tls/i686/cmov/libm-2.5.so 
b7fc4000-b7fc6000 rw-p 00024000 08:01 12895498 /lib/tls/i686/cmov/libm-2.5.so 
b7fc9000-b7fd4000 r-xp 00000000 08:01 12861504 /lib/libgcc_s.so.1 
b7fd4000-b7fd5000 rw-p 0000a000 08:01 12861504 /lib/libgcc_s.so.1 
b7fd5000-b7fd9000 rw-p b7fd5000 00:00 0 
b7fd9000-b7ff2000 r-xp 00000000 08:01 12861461 /lib/ld-2.5.so 
b7ff2000-b7ff4000 rw-p 00019000 08:01 12861461 /lib/ld-2.5.so 
bf8a0000-bf8b5000 rw-p bf8a0000 00:00 0   [stack] 
ffffe000-fffff000 r-xp 00000000 00:00 0   [vdso] 

。私は

インターネットで検索した後、私はメモリが壊れているので、それが理解されました。境界外の配列にデータを書き込む(はい、大きな配列を使用していますが、配列内のすべての要素にアクセスする前に明示的にチェックしています)、または不正なヒープメモリにアクセスしています。 しかし、コードが巨大なので、私はそれを見るだけでは分かりませんでした。だから私はValGrindに、メモリ破壊が起こっている場所を調べるようにしました。私はValGrindでコードを実行しましたが、コードのシーケンシャル部分までうまく実行されますが、パラレル部分(Pthread作成部分)では何もしません。 "top -H -p pid"の助けを借りて、私はすべてのスレッドが作成されているのを見るが、スリープモードに入っている。元のコード(valgrindなし)は、長い時間走ったハングアップしません(しかし、私はそれがデッドロックフリーであることを保証することはできません)。 Helgrind(valgrindのスレッドエラー検出器)を使用していますか?

誰でも私に文書または同様の問題を指摘できますか。それはValGrindバージョン2です。マシンはi686、Linuxオペレーティングシステムです。 D. L.クマール

+0

Cコードからスニペットを共有できますか? – codelion

+1

それは非常に非常に巨大なコードデータベースです。 15K本以上の回線であり、非常に多くの外部ライブラリに依存します。その理由は、コードのすべてのコーナーを見て一週間を過ごした後、私は問題を見つけることができなかったこれらの自動ツールに回って –

+1

まず、新しいValgrindバージョンでそれを試してみませんか? – Malkocoglu

答えて

1

おかげであなたはそれがあなたのケースのための問題を引き起こす可能性があれば必ず、シングルコア上で実行するには、この valgrind stalls in multithreaded socket program Valgrindの力のアプリケーションを確認することができませんように。

+1

Thatsに記載されているのと同じ問題が発生する可能性があります興味深いことに、私はこれが間違いなく問題だと思います。これを指摘していただきありがとうございます。私は8コア(私のホストマシンは8コアマシン)で動作するように、すべてのスレッドを明示的にマッピングしています。 Valgrindは基本的にx86プラットフォームのエミュレーションなので、1つのコアでのみ実行できますか? –

+1

これで、すべてのスレッドをシングルコアで実行しました(ただデバッグ用です)、ハングしていません。しかし、私はその場合、これらのツールの有用性は何かと思います。真の並行性の問題は、マルチコア上で実行されている場合にのみ発生します。スレッドの並行性チェッカーであるHelgrindがあります。少なくともそれは平行なものでなければなりません。 –

+2

多くの生きているクライアント接続を持つマルチスレッドプログラムでvalgrindを使うことを覚えています。問題なく動いていますが、ちょっと遅いです... – Malkocoglu

関連する問題