1

私のコードはデスクトップでは機能するが、リモート クラスターではクラッシュするという非常に奇妙な状況に陥っています。私はコースコードのエラーをチェックし、デバッガーで実行してコードを壊すものをキャッチし、valgrind でメモリリークを探すことに数え切れないほどの時間を費やしました (少なくとも gcc ではクリーンであることが判明しました)。

最終的に、これまでにわかったことは、同じコンパイラ (gcc 4.4.5) を使用している限り、同じソース コードが両方のマシンで同じ結果を生成するということです。問題は、リモート クラスターで Intel コンパイラを使用してパフォーマンスを向上させ、Intel を使用するビルド済みのライブラリを使用したいということです。その上、gcc が intel コンパイラーでキャッチされたいくつかのメモリの問題を無視しているのではないかと心配しています。

これは私のコードにとって何を意味しますか?

4

2 に答える 2

4

おそらく、未定義、未指定、または実装定義の動作に依存していることを意味します。

変数を初期化するのを忘れた、有効な範囲を超えて配列にアクセスした、またはa[i] = b[i++]コードのような式を使用したなどの可能性は事実上無限です。

于 2012-09-25T18:49:46.027 に答える
0

クラッシュの結果、コア ファイルが生成されますか? 複数のコア ダンプからの gdb 'bt' コマンドに相当するバック トレースに一貫性がある場合は、printf ステートメントを選択的に挿入し始め、スタック トレース内の関数のリストをさかのぼって作業することができます。

メモリ リークが検出されない場合、ヒープはおそらく問題ありません。これにより、スタックが潜在的な問題領域として残ります。スタックを壊している初期化されていない変数があるようです。

gcc/g++ コンパイル コマンド引数に「-fstack-protector」を含めてアプリをコンパイルしてみてください。

于 2012-09-29T20:43:16.353 に答える