忍者ブログ
[267] [266] [265] [264] [263] [262] [261] [260] [259] [258] [257]

DATE : 2024/04/30 (Tue)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


DATE : 2007/02/09 (Fri)

開発中の BREW アプレットのバグが取れました。

バグの発生元がなかなか分からず苦戦していたのですが、なんとかなりました。

(;´Д`)とても簡単なミスでしたが……。

開発していたのはファイルを読み込んで処理するアプレットです。レコードが50件ほどのファイルだと快調に動作します。しかし、レコードが10000件程度になると、起動してすぐにメモリの空き領域が急激になくなり、そのままアプレットが強制終了してしまいます。

BREW シミュレータにデバッガをアタッチして調べてみたところ、次の部分でアプレットが強制終了しました。(コードは分かりやすいように改変してあります)

void processData(Data& data) {
    ...
    this->add(data);

    if (this->isFull()) {
        return;
    }
    ...

    this->readData();
}

読み込まれたデータを add メンバ関数で追加するコードです。追加後、データを格納するバッファがいっぱいでなければ、さらにデータの読み込みを求めます(readData メンバ関数は BREW にデータの読み込みを要求するだけで終了します。その後、BREW がデータの読み込みを行う関数を呼び出します。BREW ではできるだけ早く実行環境側に処理を戻さないといけないので、ループは使っていません)。

どうも、バッファが溢れているのが原因のようです。そこで、まず add メンバ関数を調べてみます。

void add(Data& target) {
    this->data[this->dataCount] = target;

    this->dataCount++;
}

あらかじめ一定数を確保しておいた配列にデータをコピーして、格納した個数を表すカウンタを増やしているだけです。

dataCount の初期値を調べてみましたが、特におかしいところはありません。dataCount の値を出力してみても、初期値は正常でした。ただ、想像したとおり、dataCount の値は配列の要素数を軽く超えていました。

すると、残るは isFull メンバ関数ということになります。しかし、isFull メンバ関数はとても簡単です。ただ単に dataCount が配列の要素数以上であれば true を返すだけです。例えば、配列の要素数が DATA_ARRAY_SIZE だとすると、次のようなコードになるはずです。

bool isFull() const {
    return (this->dataCount >= DATA_ARRAY_SIZE);
}

( ^ω^)普通は間違えません。

しかし念のため、isFull メンバ関数を確かめてみると……。

bool isFull() const {
    return false;
}

(゚Д゚)

(;´Д`)そういえば、前に起きたバクを直すときに、テスト用に isFull 関数の中身を消したことを忘れていました。

PR
●この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
●この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]
ブログ内検索
最近の状況
リンク
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック
ブログ内検索
最近の状況
リンク
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
使用許諾
最新コメント
(08/15)
(05/04)
(03/06)
(03/04)
(09/25)
最新トラックバック