バックグラウンド
新しいバージョンの CC コンパイラに移行しているときに、以前は機能していたモジュールでセグメンテーション違反が発生しました。
これまでの観察
コア ファイルから、segfault がどの関数で発生したかを知ることができました。機能を観察したところ、疑わしいものは見つかりませんでした。
最初の大きな問題は、segfault が "リリース" (最適化がオンになっている) でコンパイルした場合にのみ再現され、"デバッグ" では再現されないことでした。また、segfault は g++ では再現しません。
今、私は印刷を使い始めましたが、コード内の特定の行に
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」に取り組んでいます
詳細はコメントに応じて
- コードはシングルスレッドです。
- valgrind は Solaris では使用できないため、関係ありません。