私はsparcコンパイラを書いています。テストケースの1つは、コマンドラインから正常に実行すると正常に機能しますが、出力をファイルにリダイレクトするとsegfaultが発生します。
GDBを使ってみましたが、組み立てが難しいです。どのアセンブリラインがセグメンテーション違反を引き起こしているのかという単純なものをどのように把握できますか?
私はsparcコンパイラを書いています。テストケースの1つは、コマンドラインから正常に実行すると正常に機能しますが、出力をファイルにリダイレクトするとsegfaultが発生します。
GDBを使ってみましたが、組み立てが難しいです。どのアセンブリラインがセグメンテーション違反を引き起こしているのかという単純なものをどのように把握できますか?
残念ながら、GDBは、UnixSPARCのマシンレベルの問題をデバッグするための最良の方法です。これはちょっと悲しいことです。
理解しておくべき基本的なことは、セグメンテーション違反は一種の例外であり、例外がアタッチされている場合、例外によってプログラムがデバッガーに侵入することです。これは、クラッシュ時のプロセッサレジスタとメモリの状態を調べることができるようにするためです。
命令カウンタレジスタ(%ip)を確認する必要があります。これには、実行する最後の命令のアドレスが含まれます。これは、セグメンテーション違反をトリガーした命令です。これはロードまたはストア操作になるため、どのレジスタに送信元/宛先メモリアドレスが含まれているかを調べ、そのアドレスが不正である理由(通常はNULL、または有効なアドレスではないガベージ番号)を特定できます。
もう1つできることは、プロセスをコンパイルして、失敗したときにコアダンプを発行することです。これにより、プログラムがディスク上に大きなファイルとして停止したときのプログラムの状態のスナップショットが書き出されます。残念ながら、コアダンプの読み取りに使用されるプログラムは...gdbです。