だから私はこのエラーを何時間もデバッグしてきました。Ogre3dを使用してプログラムを作成したのは、シンボルがロードされないため、トレースをスタックできないため、クラッシュの場所を見つけるのがさらに困難になったためです。したがって、特定の関数を呼び出す前に「開始」を出力してから関数を呼び出し、「停止」を出力した直後に書き込みます。関数全体を通して、関数が戻る直前にFが印刷される文字AFを印刷します(最後の'}'の1行上)奇妙なことに、クラッシュが発生したときは、'F'が印刷された後ですが、'停止はありません'。これは、クラッシュがどこかで起こっていることを意味しますか?私が考えることができる唯一のことは、関数中に割り当てられたメモリの一部の割り当て解除中に問題が発生したことです。私'
4 に答える
ほとんどの場合、奇妙で理解できないことが起こりますが、それは他の何かのせいです。
コード内に(その関数から遠く離れた場所でも)いくつかのランダムなメモリセルを指すダングリングポインタを含めることができます。
このようなダングリングポインタを使用した可能性があり、その結果、必要なメモリセルが上書きされた可能性があります。この結果、他の場所で定義されている変数、定数、またはコードを変更することで、プログラムの動作を変更できます。
Valgrindのように、誤ったメモリアクセスをチェックして報告できるツールを使用してアプリケーションをデバッグすることをお勧めします。
とにかく、クラッシュの原因を特定し、クラッシュする非常に小さなコードをここに投稿することができれば、説明からはそうは思われませんが、関数の単純なエラーである可能性があります。
これはおそらく、関数が戻り、デストラクタが起動しているときにエラーが発生していることを意味します。デストラクタが所有していないメモリを解放しようとしたり、ログのバッファの終わりを書き留めたりする可能性があります。
出力ストリームをフラッシュしていない場合は、注意すべきもう1つの可能性があります。「Stopping」が出力されている可能性がありますが、を押す前にバッファリングされていstdout
ます。これが起こっている場合は間違った木を吠えているので、これを確認してください。
同様の問題が発生し、どこにも戻り値を使用していなくても、署名がstd :: shared_ptrの戻り値タイプを予期しているときに、関数が何も返さないことが判明しました。
この関数には次のシグネチャがあります。
std::shared_ptr<blDataNode> blConditionBasedDataSelectionUI::selectData(std::shared_ptr<blDataNode> inputData)
{
// My error was due to the function
// not returning anything
}
同じ問題が発生し、新しいアイテムを追加する前にベクトルを初期化するのを忘れたことが判明しました。これにより、関数がベクトルを他のリストと比較しているときにエラーが発生しました。
std::vector<cv::Point> lefteyeCV;
void Init() {
// I need to add "lefteyeCV.clear();" here!
for (int i = 0; i < 8; i++) {
lefteyeCV.push_back(cv::Point(0, 0));
}
}
// the following comparison will crash after "return 0"
// because cl_ is of size 8, but if I run "Init()" twice, lefteyeCV.size() = 16
// then the comparison is out of range.
int irisTrack(){
for (int i = 0; i < lefteyeCV.size(); i++) {
cl_[i] = cv::Point(lefteyeCV[order[i]].x - leftRect.x, lefteyeCV[order[i]].y - leftRect.y);
}
return 0;
}
紛らわしいのは、Xcodeを使用していて、「return 0」の直後にアプリがクラッシュし、判読できないメッセージ「thread 13:signalSIGABRT」が表示されることです。ただし、代わりにVisual Studioを使用すると、インデックスが範囲外の行が表示されました。