ホーム > デベロッパ > SophiaFramework > BREW C++ 逆引きコード集

BREW C++ プログラミング 逆引きコード集 : デバッグ

C++ で作成されたBREW アプリで、効率の良いデバッグを行う方法です。
SophiaFramework を用いています。

mod ファイルを作成できない

コンパイル時にエラーが発生せず、mod ファイル作成時に以下のエラーが発生する場合があります。

non-POD object cannot be passed as '...' argument

このエラーメッセージは、SFXHelper関数使用時のエラーの可能性があります。(BREW関数使用時にも同様のエラーが起きる可能性があります。)

以下にエラー出力例を記述します。

// 例 : SFXHelper::dbgprintf を使用したとき

// NGの記述例
SFXAnsiString str
SFXHelper::dbgprintf("%s", str); // C 言語の文字列に変換していないのでエラー

// OKの記述例
SFXAnsiString str
SFXHelper::dbgprintf("%s", str.GetCString()); // C 言語の文字列に変換しているのでOK
      

コンパイルできない (インクルードファイル「AEEKDDI.h」のエラー)

以下のエラーメッセージが出てコンパイルできないときは、KDDI社BREW 日本拡張パッケージの定義 TARGET_EXTENSION_KDDI を削除する必要があります。

ただし、KDDI BREW 日本拡張パッケージを使用する場合は、下記の設定が必要です。このときは、KDDI BREW 日本拡張パッケージが正しくインストールされていない可能性があります。

「fatal error C1083: include ファイルを開けません。'AEEKDDI.h'」

削除手順

Visual C++ 6.0 の場合

・メニューから [プロジェクト] -> [設定] を選択する。
・[C/C++] タブを選択する。
・[プリプロセッサの定義] の項目から [TARGET_EXTENSION_KDDI] を削除し、OKボタンを押す。

Visual Studio 2003/2005 の場合

・メニューから [プロジェクト] -> [プロパティ] を選択する。
・[C/C++] フォルダから[プリプロセッサ]を選択する。
・[プリプロセッサの定義] の項目から [TARGET_EXTENSION_KDDI] を削除し、OKボタンを押す。

      

modファイル作成後に、警告メッセージが表示される

modファイル作成時に以下のメッセージが出力されます。

Deprecated command syntax will not be supported in future versions. Use -output to specify the output file.
Finished: 0 information, 1 warning and 0 error messages.

この警告メッセージはBREW SDK 付属のアドインが生成しているメッセージで、古いリンカオプションを指定しているときに出力されます。

アプリの動作には問題ありません。

この警告メッセージが発生しないようにするには、メイクファイルにある
$(HEXTOOL)  $(TARGET).$(EXETYPE) $(BINFORMAT) $(TARGET).$(MODULE)
$(HEXTOOL)  $(TARGET).$(EXETYPE) $(BINFORMAT) -output $(TARGET).$(MODULE)
に変更します。
      

コンパイル時に警告メッセージが出力される

コンパイル時に以下のメッセージが出力される場合があります。

「LINK : warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。」

この警告メッセージはライブラリがリリースバージョンなのにも関わらず、アプリをデバッグバージョンで
ビルドすることによって出力されます。

アプリの動作自体に問題があるわけではありません。

      

ヒープ サイズに上限を設定する(デバッグ時)

メモリが少ない中でのアプリの動作を確かめたいときなどに、
ヒープ サイズに上限を設定するには、SFDWatcher::setlimit 関数を使用します。
設定した上限をなくすには、SFDWatcher::resetlimit 関数を使用します。

// デバッグ モードなら
#if defined TARGET_ENVIRONMENT_SIMULATOR

// ヒープ サイズの上限を 10000 バイトに設定する
SFDWatcher::setlimit(10000);

#endif

ACharPtr p1, p2;
// 6000 バイトメモリ確保を2回行う
p1 = static_cast<ACharPtr>(MemoryAllocate(6000)); // 成功
p2 = static_cast<ACharPtr>(MemoryAllocate(6000)); // 失敗(p2 は null)

#if defined TARGET_ENVIRONMENT_SIMULATOR

SFDWatcher::resetlimit(); // 上限をなくす

#endif

参考 SFDWatcher::setlimit | SFDWatcher::resetlimit | MemoryAllocate

      

未解放ヒープを表示する

デバッグ時に未解放ヒープを表示するには、SFDWatcher::dumpleak 関数を使用します。
この機能を使用することにより、メモリ リークの検出を行うことができます。

// デバッグ モード(シミュレータでの実行)なら
#if defined TARGET_ENVIRONMENT_SIMULATOR

// デバッグ ウィンドウに未解放ヒープを表示する
SFDWatcher::dumpleak();

// "line 47, file 'helloworld.cpp' : 0x01085020 [400 bytes]"
// "line 48, file 'helloworld.cpp' : 0x010851E8 [800 bytes]"
// のように、メモリを確保した場所やアドレス、サイズが表示される

#endif

参照 SFDWatcher::dumpleak

      

使用ヒープ量を表示する

デバッグ時に使用ヒープ量や最大使用ヒープ量を表示するには、
SFDWatcher::dumpuse 関数を使用します。

// デバッグ モードなら
#if defined TARGET_ENVIRONMENT_SIMULATOR

// デバッグ ウィンドウに使用ヒープ量と最大使用ヒープ量を表示
SFDWatcher::dumpuse();

// デバッグ ウィンドウには、
// "SophiaFramework::SFDWatcher : current xxx bytes, maximum xxx bytes"
// と表示される

#endif

参照 SFDWatcher::dumpuse

      

デバッグウィンドウに文字列を表示する

エミュレータ使用時のみデバッグウィンドウに文字列を表示するには、
TRACE マクロを使用します。
SFXAnsiStringSFXWideString 文字列を表示する場合は、一度 C 言語型文字列に
変換してから TRACE マクロに文字列を渡します。

SFXAnsiString str;

TRACE("%s", str.GetCString());

SFXWideString を表示する場合には、一度 SFXAnsiString に変換します。

SFXWideString str;

TRACE("%s", SFXAnsiString(str).GetCString());

参照 TRACE | SFXAnsiString::GetCString