問題タブ [valgrind]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - valgrind を補完しますか?
ここ数週間、アプリケーションをクラッシュさせる非常に難しいバグを突き止めようと取り組んできました。最初に、アプリケーションは std::string の代入時にクラッシュし、次にローカル変数の解放中にクラッシュしました。
コードを注意深く調べたところ、これらの場所でクラッシュする理由はありませんでした。ただし、無効なポインタ (つまり、無効なメモリを指すポインタ) を解放しようとすると、常にクラッシュします。そして、このポインターが正しい場所を指していなかった理由がわかりません。
この問題は、メモリ破損の問題または何らかのポインタ破損の問題に関係していると思われます。問題は、視覚的に追跡できないことです....まだ。コードのどこから調べればよいのかわからず、何千行ものコードを通過する必要があるため、これは問題に対する現実的なアプローチとは思えません。
そこにヴァルグリンドが…
このタイプのクラッシュにつながる可能性のあるコード内の問題を見つけるために、私が何度も依存してきたツール。しかし、今回は手ぶらで登場!問題が発生したときに valgrind にエラーが表示されないため、この質問をする理由です。
valgrind を補完し、上記のクラッシュを引き起こす可能性のあるコードの問題を見つけるのに役立つ他のアプリケーションはありますか?
ありがとう!
c++ - std::string 割り当ての実行中に C++ プログラムが常にクラッシュする
文字列に単純な代入をしようとしているときにクラッシュする (つまり、 * glibc が検出された * free(): 無効なポインター: 0x000000000070f0c0 *** をアサートする) アプリケーションのクラッシュをデバッグしようとしています。最適化レベルを -O2 に設定して、gcc 4.2.4 を使用して Linux システムでコンパイルしていることに注意してください。-O0 を指定すると、アプリケーションはクラッシュしなくなりました。
例えば
しかし、次のようにコードを変更すると、クラッシュしなくなりました
それでまた頭をかいた!しかし、興味深いパターンは、クラッシュがアプリケーションの後半に移動し、別の文字列で再び発生したことです。文字列の代入でアプリケーションが継続的にクラッシュするのは奇妙だと思いました。典型的なクラッシュ バックトレースは次のようになります。
これは非常に奇妙な動作だったので、アプリケーションをさらに調べて、この奇妙な動作を引き起こしている可能性のある何らかのメモリ破損 (ヒープまたはスタック) エラーが発生していないかどうかを確認しました。ptr の破損もチェックしましたが、手ぶらで出てきました。コードの目視検査に加えて、次のツールも試しました。
- memcheck と exp-ptrcheck の両方を使用する Valgrind
- 電気柵
- libsafe
- gcc で -fstack-protector-all でコンパイルしました
- MALLOC_CHECK_ を 2 に設定してみました
- コードを lint チェックと cppcheck (間違いをチェックするため) で実行しました。
- そして、gdb を使用してコードをステップ実行しました
だから私はたくさんのものを試しましたが、それでも手ぶらで出てきました。したがって、この問題を引き起こしている可能性があるのは、リンカーの問題やライブラリの問題のようなものではないかと考えていました。make が -O2 でクラッシュしやすい std::string に関する既知の問題はありますか、それとも最適化レベルとは関係ありませんか? しかし、私の問題でこれまでに確認できる唯一のパターンは、常に文字列でクラッシュするように見えることです。そのため、この種の動作を引き起こしている問題を誰かが知っているかどうか疑問に思っていました.
どうもありがとう!
linux - valgrindで実行する特定の子プロセスを除外するにはどうすればよいですか?
Linuxでデーモンを実行していますが、このデーモンをvalgrindで実行して、メモリ関連のエラーを見つけたいと考えています。これはデーモンなので、--trace-children=yes
オプションを使用する必要がありますが、これにより、後の存続期間中に多くのプロセスが生成され、valgrindで実行したくありません。特定の子供をvalgrindの下で走ることから除外する方法はありますか?
c++ - valgrind のインストール後にブレークポイントが機能しない
valgrind をインストールしたばかりですが、qtcreator でブレークポイントが機能しません。どうすればこれを修正できますか?
デバッグ: GDB プロセスが実行されていません。CMD は無視されます: -stack-list-arguments 2 0 0
shared-libraries - 特定の .so ファイルを完全に抑制するように Valgrind に指示するにはどうすればよいですか?
作業中のプログラムで Valgrind を使用しようとしていますが、使用しているライブラリの 1 つに対して Valgrind が大量のエラーを生成します。そのライブラリに関連するすべてのエラーを抑制するように指示できるようにしたいと思います。抑制ファイルについて思いつく最も近いルールは次のとおりです。
ただし、これで完全に機能するわけではありません。発生するすべての抑制タイプ (Cond、Value4、Param など) に対してこれらのいずれかを作成する必要がありますが、スタック トレースにライブラリがあるいくつかのエラーがまだ見逃されているようです。
Valgrind に単一の抑制ルールを与えて、特定のライブラリを完全に無視させる方法はありますか? また、すべての抑制タイプをカバーするようなルールを作成する方法がなくても、少なくとも、特定のライブラリの特定の抑制タイプのすべてのエラーを無視するルールを作成する方法はありますか?
multithreading - callgrind/kcachegrindを使用してスレッドごとの統計を取得する
アプリケーションの各スレッドがcallgrindをどのように「高価」に使用しているかを確認したいと思います。--separate-thread=yes
アプリ全体のcallgrindファイルとスレッドごとに1つのcallgrindファイルを提供するオプションを使用 してプロファイルを作成しました。
これは特定のスレッドのプロファイルを表示するのに便利ですが、私が本当に必要としているのは、各スレッドからのCPU時間のソートされたリストであり、どのスレッドが最大の豚であるかを確認できます。
linux - 再構築せずに Linux プラットフォームでプログラムをプロファイリングする方法は?
プログラムを再構築せずにプロファイリングできる 2 つのプロファイリング ツール (Windows では VTune、Solaris では dbx (sunstudio 内)) を使用しました。プロファイリング中、プログラムは通常と同じ速度で実行されます。これら 2 つの機能の両方により、多くの時間を節約できました。
ここで、Linux プラットフォームで同じことができる無料のツールがあるかどうかを知りたいです。サンプリングに基づくプロファイリング ツールが必要だと思います。VTune は優れていますが、高価です... gprof と valgrind について聞いたことがあります。しかし、gprof はプログラムを計測する必要があるようで (そのため、プログラムを再構築する必要があります)、valgrind はプログラムの実行をかなり遅くします。(valgrind の紹介によると、Cachegrind は通常よりも約 20 ~ 100 倍遅いプログラムを実行し、プロファイリングが必要な Callgrind は Cachegrind に基づいています)
プロファイリングでは、関数呼び出しの実行時間を把握するだけでよく、パフォーマンスの低下がどこで発生しているかを突き止めることができます。実際、Cachegrind が提供するように、多くの低レベルのプロファイリング情報は必要ありません...
profiling - callgrindを使用して、プログラム実行の特定の期間のみをプロファイリングするにはどうすればよいですか?
プログラムを再構築する必要がないので、valgrindを使用してプロファイリングを行いたいと思います。(プロファイリングしたいプログラムはすでに「-g」でビルドされています)
しかし、valgrind(callgrind)は非常に遅いです...だから私がすることは次のとおりです:
- サーバーを起動します(そのサーバーのプロファイルを作成します)
- そのサーバーへの接続の種類
- サーバーで操作を行う前に、プロファイルデータの収集を開始します
- 操作が完了したら、プロファイルデータの収集を終了します
- プロファイリングデータを分析します。
Solarisのsunstudioを使用してこの種のことを行うことができます。(dbxを使用)。valgrind(callgrind)を使用して同じことを行うことは可能ですか?
ありがとう
c - メモリリーク解放 g_strdup
g_strdup を解放しようとしていますが、何が間違っているのかわかりません。
を使用しvalgrind --tool=memcheck --leak-check=yes ./a.out
て取得し続けます:
解放するためにさまざまな方法を試しましたが、これまでのところ成功していません。どんな助けにも感謝します。ありがとう
ところで:コンパイルして正常に実行されます。
linux - メモリプロファイルにvalgrindを使用するにはどうすればよいですか?
メモリプロファイルにvalgrindを使用する方法を教えてください。私がグーグルから見つけた記事は、メモリリークのためにvalgrindを使用する方法について話します。これをメモリプロファイリングに使用する方法(つまり、どのクラスでどのくらいのメモリが使用されているか)に興味がありますか?
ありがとうございました。