1

私はゲームに取り組んでいます。ある場所では、セグメンテーション違反が発生することがありますが、それ以外の場合は、コードが正しく機能します。(セグメンテーション違反を受け取った後)ゲームを再度実行すると、(コードを変更せずに)回復し、正常に実行されます。しかし、しばらくすると、これが再び起こります。

GDBを使ってデバッグしてみました。次の情報を入手しました。

  1. 関数呼び出し:func(&s.x)があります。ここで、sは構造体であり、xはint型のメンバーです。アドレス(&s.x)は0xb3456721です
  2. 関数funcでは、引数で受け取った値は0xbです。
  3. プログラムがクラッシュし、0xbのメモリにアクセスできないと表示されます。GDBを使用して変数を出力すると、メモリにアクセスできなくなります。

何かアイデアなぜこれが起こるのでしょうか?

4

3 に答える 3

6

与えられた同一の入力に非決定論的なデータ ソースが含まれている場合に、クラッシュすることはあるがクラッシュしないプログラム。通常、ソースは初期化されていない変数またはメモリ ブロックですが、タイムスタンプ、プロセス ID、またはさまざまなシステムからのその他の入力ソースに依存している可能性があります。

于 2012-09-28T18:07:15.530 に答える
1

以前、Linux でvalgrindを使用して、初期化されていない変数によって引き起こされる非決定論的な動作をデバッグしたことがあります。

これが私が使用するvalgrindコマンドです。プログラムとオプションは次のとおりです。

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes --track-origins=yes -v 

Windowsで実行している場合は、この回答を見てvalgrind代替品を探してください

Windows に代わる適切な Valgrind はありますか?

あなたのプログラムはマルチスレッド化されていますか? 非決定性の原因の 1 つは競合状態です。

于 2012-09-28T18:44:52.153 に答える
0

C++ タグが存在するため、関数を呼び出していると言っているので: func(&s.x)、引数パラメーターfuncで受け取ったということを考えると、実際には不適切に初期化された参照であると私は信じています。たとえば、次のことを考慮してください。0xbs

struct foo {
    char a[12];
    int x;
};

void func (int *x) {
    *x = 0;
}

int main () {
    foo *sp = (foo *)-1;
    foo &s = *sp;
    func(&s.x);
}

十分な情報が提供されていないため、問題の正確な性質を診断することは不可能です。

于 2012-09-28T18:13:40.990 に答える