1

ポインタを無効な値で上書きすることによって引き起こされるバグに問題があります。valgrind(デフォルトモード)またはGDBを使用してバグを見つけることができませんでした。なぜなら、それらは無効なポインターを指しているだけであり、そのポインターを誤った値に上書きしたものではないからです。

これは常に同じ変数ですが、明示的に不正な値に設定することはありません。プログラムの他の行は、その範囲外のメモリにアクセスしている必要がありますが、偶然に、代わりにこのポインタのストレージにヒットします。

このバグに対処するためにどのデバッグツール/オプションを使用すべきかわかりません。

クラッシュの例:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff6ffc700 (LWP 2425)]
0x00000000004058b2 in writeToConn (conn=0x7ffff0004f40) at streamHandling.c:115
115             ssize_t result = send(conn->fd, conn->head->data->string + position, conn->head->data->size - position, 0);
(gdb) print conn
$1 = (struct connection *) 0x7ffff0004f40
(gdb) print conn->head->data
$2 = (struct dbstring *) 0x35

残念ながら、conn->head->data約5,000のconn構造体があるため、変数を単純に監視することはできません。

このコードはほとんどの場合機能しますが、適度に重い負荷で実行すると、数秒後にクラッシュします。

4

2 に答える 2

2

gdbブレークポイントがトリガーされたときに、ブレークコマンドを使用してコマンドを自動的に実行することができます。

が割り当てられるたびに実行するようにブレークコマンドを設定しstruct connection、対象のフィールドにウォッチポイントを追加することができます。

于 2012-10-14T08:05:32.297 に答える
0

スタックバックトレースは役立ちますか?これがその方法を説明するページです。

Cでスタックトレースを取得するにはどうすればよいですか?

于 2012-10-14T07:25:03.720 に答える