1

私はSparcコンパイラを書いています。私のテストケースの1つは正常に実行されますが、出力がファイルにリダイレクトされるとクラッシュします。

GDBを使用して、これがセグメンテーション違反の原因となる行であることがわかりました。

save  %sp, -800, %sp

スタックスペースが不足していますか?どうしたんだ?出力をリダイレクトしたときにのみ発生するのはなぜですか?

4

1 に答える 1

0

SPARCのsave命令は、ウィンドウスピルトラップを介してのみセグメンテーション違反をトリガーできます。これは次の場合に発生します。

  1. スタックが不足している(および/またはスタックポインターが破損している)
  2. そして、ウィンドウスピルを引き起こします(つまり、レジスタウィンドウのライトバックフラッシュをスタックに)。

後者は、発生に予測不可能な要素があることを意味します。これは、スピルの発生が以前のレジスタウィンドウの使用状況に依存するためです。スピルの正確な発生は、同じCPUをタイムシェアする他のプロセスによって変更される可能性があります。Solarisは、パフォーマンスを低下させるため、すべてのコンテキストスイッチで設定されたregウィンドウ全体を自動スピルしません。たとえば、それぞれ8つのウィンドウ(スタックフレーム)を使用する2つのワークロードは、お互いをうまくプリエンプトし、16以上のregウィンドウを備えたCPUで完全に「スタックフリー」で実行できます。
出力のリダイレクトが原因で流出の可能性が高まる可能性があることを想像できます(コンソールへの書き込み側よりもファイルへの書き込みのスタックが深いほど、プロセスの登録が優先される可能性が高くなります)。

この場合、バックグラウンドCPU /スタックホガー(ループ内で200000の再帰的階乗、regウィンドウを永続的に破棄する)をバインドすると、出力リダイレクトがなくてもテストケースの一貫した失敗を強制できるはずです。テストケースが処理しているのと同じCPU。

于 2010-12-15T12:00:37.810 に答える