6

バックグラウンド

新しいバージョンの CC コンパイラに移行しているときに、以前は機能していたモジュールでセグメンテーション違反が発生しました。

これまでの観察

  1. コア ファイルから、segfault がどの関数で発生したかを知ることができました。機能を観察したところ、疑わしいものは見つかりませんでした。

  2. 最初の大きな問題は、segfault が "リリース" (最適化がオンになっている) でコンパイルした場合にのみ再現され、"デバッグ" では再現されないことでした。また、segfault は g++ では再現しません。

  3. 今、私は印刷を使い始めましたが、コード内の特定の行にcout/ printf(segfault 行をバイナリ検索する/ポインターの値を出力する) を追加すると、segfault が再現しませんでした。さらに、segfault を維持するコードの特定の行に cout を追加しました。これは、おそらくその行の前に segfault が発生したことを意味します。その行の後にコメント行を追加すると、segfault が解消されました。

私には、これは(特にスタックの)メモリの破損を叫んでいますが、生成されたアセンブリを見ずにこれを進める方法がわかりません。

何か案は?前もって感謝します。

私はSunOS_5.10_Studio_12_5.12_64、CCバージョン「Sun C++ 5.12 SunOS_sparc 2011/11/16」に取り組んでいます

詳細はコメントに応じて

  1. コードはシングルスレッドです。
  2. valgrind は Solaris では使用できないため、関係ありません。
4

1 に答える 1

2

valgrindのようなメモリ デバッガー/プロファイラーを使用する必要があります。破損の場所がすぐにわかります。Solarisでは、 libumemを試すことができます。

于 2012-07-25T15:49:20.510 に答える