タグ

デバッグに関するyowanoのブックマーク (15)

  • Maverick Project

    yowano
    yowano 2013/11/01
    デバックウィンドウにエラーもしくはワーニングが出力された場合の、原因と解決方法のまとめ。
  • assert マクロを使う―C/C ―水無瀬の部屋

    assert( expression ) 関数型マクロ assert() は式 expression が 偽 の場合に診断メッセージを表示して関数 abort() を呼び出します。 ヘッダファイル assert.h がインクルードされる前にマクロ NDEBUG を定義するとマクロ assert() の呼び出しは除去されます。 assert() マクロは簡単な論理エラーを検出するために役立つ道具の一つです。 前提条件を仮定している場所に assert() マクロを挿入しておくと論理エラーを発見しやすくなります。 たとえば次のような前提条件を検査できます。 // 例えば引数にポインタ NULL を認めない関数の先頭で引数の仮定を検査するために // ポインタ p は NULL ではないはずだ! assert( p ); // ストリーム fp の現在位置はファイル終端ではないはずだ! asse

    yowano
    yowano 2013/10/28
    assertマクロの簡単な解説と実用例。
  • ビルドエラー対処法 [VC++の使い方]

    はじめに 初心者には分かりにくい VC++ のビルドエラー。一応、エラー番号を MSDN に入力すれば解説は出てくるが、どうにもこうにもわかりにくい。初心者にとっては 『じゃあ、実際にどうしたらいいのか』 という情報が抜け落ちているように思う。このリファレンスが、その疑問を解決できたら望である。 ただし、ここに記述されている対処法がすべてではないし、ここに記述されていないエラーの方が多い。MSDN には、すべてのエラーについてのドキュメントがあるので詳細はそちらを参照してもらいたい。残念ながら、VC++ を使う以上は、MSDN に慣れなければならない。MSDN からほしい情報を自力で見つけ出せるようになったら、初心者ではないと宣言できる気がする。というか、MSDNはほんまに分かりにくいんだけどね・・・。 この一覧は、VC++ 6.0 でよく発生するエラーについて述べています。5.0以前や

    yowano
    yowano 2013/10/14
    遭遇しやすい VC++ のビルドエラーと、それに対する具体的な解決法の一例のまとめ。
  • http://red.ap.teacup.com/rossolab/120.html

    http://red.ap.teacup.com/rossolab/120.html
    yowano
    yowano 2013/09/30
    同じz値のオブジェクトを描画すると、どちらが手前になるのか正確に判断できず、描画が不安定になるZバッファ干渉(Zファイティング)が起きるが、そういう時はZ値を0.1mm程度ずらす対策を施すのが合理的。
  • ワーニング(warning)の抑制-VC++ #pragma warning(disable:XXXX) | == fancy dolce ==

    的にワーニングはプログラムに存在するかも知れないバグを回避するための重要な情報ですが、 明らかに目的に合致したコードで、それでいてどうしてもワーニングが出てしまう、 そのような場合があります。 以下はそういった場合のコンパイル時にワーニング出力を抑制する方法です。 #pragma warning(push) #pragma warning(disable:4200) /// ここに「C4200」のワーニングの発生するコードがあっても、コンパイル時には出力されなくなる。 #pragma warning(pop) 上の例では、「disable:4200」から「warnig(pop)」の間、「C4200」のワーニングが出力されないようになります。 複数のワーニングを抑制したい場合には、以下のような記述が可能なようです。 #pragma warning(push) #pragma warn

    yowano
    yowano 2013/09/25
    #pragma warning(push)、pragma warning(disable:エラー番号)、#pragma warning(pop)を使うことで、特定のエラーを一時的に無視できる。
  • deleteを使うときのマクロ - ゲームが作れるようになるまでがんばる日記

    DirectXのサンプルを見ていたら、DXUT.hに確保したメモリを安全に解放するためのマクロがあったので引用。 #ifndef SAFE_DELETE #define SAFE_DELETE(p) { if (p) { delete (p); (p)=NULL; } } #endif #ifndef SAFE_DELETE_ARRAY #define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p)=NULL; } } #endif #ifndef SAFE_RELEASE #define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } } #endifSAFE_RELEASEはインターフェイスの参照カウンタを減少させるもの。カウンタが0になったら解放される。 ポインタがNUL

    deleteを使うときのマクロ - ゲームが作れるようになるまでがんばる日記
  • バッファオーバーフロー - Wikipedia

    バッファオーバーフロー(英: buffer overflow)またはバッファオーバーラン(英: buffer overrun)は、コンピュータのプログラムにおけるバグのひとつ、またはそれにより引き起こされる現象で、プログラムがバッファに割り当てられた空間よりも大きなデータを書き込むことで、データがバッファ境界からあふれ、バッファの範囲外のメモリを上書きし、元々そのメモリにあったデータを破壊してしまうことを指す。 バッファオーバーフローは、上書きされるメモリ領域がスタック領域なのかヒープ領域なのかに応じてそれぞれスタックベースのバッファオーバーフロー、ヒープベースのバッファオーバーフローと呼ばれる。なお、名称が似ているスタックオーバーフローとは別の現象である。 サイバーセキュリティ・情報セキュリティの分野では、バッファオーバーフローはメモリ破壊系の脆弱性の一つとして知られ[1]、攻撃者がバッ

    yowano
    yowano 2013/06/11
    設計者が意図していないメモリ領域の破壊が起こされるバグのひとつ。バッファオーバーランは深刻なセキュリティホールになりうる。多発するのは文字列と配列。これらでなくとも入力データのサイズの検知は確実に行う
  • スタックオーバーフロー - Wikipedia

    スタックオーバーフロー (英: stack overflow) は、コンピュータプログラムにおいて、コールスタック領域の限界を超えたデータプッシュにより発生する、バッファオーバーフローの一種である。スタックバッファオーバーフロー (英: stack buffer overflow) とは別の概念である。 概要[編集] プログラムにおいて、サブルーチン(関数/プロシージャ)呼び出しに関する情報を格納するためのスタックメモリ領域(コールスタック)が確保される。サブルーチン呼び出しのたびにデータがスタックに積まれ(プッシュ)、サブルーチンが終わって制御フローが呼び出し元に戻るとスタックからデータが降ろされる(ポップ)。オペレーティングシステムや実行オプションにもよるが、コールスタックに格納できる情報量には上限がある。コールスタックに蓄積されるデータ量が限界を超えるとスタックは「オーバーフロー」し

    yowano
    yowano 2013/06/11
    プログラム中での関数呼び出しが多すぎる時に発生する、バッファオーバーフローの一種。関数呼び出しや再帰処理による無限ループ、大きすぎる配列の確保を行う(静的あるいはヒープ領域での確保は大丈夫)と起きる。
  • 「ヒープが壊れていることが原因として考えられます。」の原因は二重deleteかも - ginpeiのブログ

    VC++でデバッグ中に HEAP[hoge.exe]: Invalid Address specified to RtlFreeHeap( 00000000, 00000000 ) Windows によって hoge.exe でブレークポイントが発生しました。 ヒープが壊れていることが原因として考えられます。hoge.exe または読み込まれた DLL にバグがあります。 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。 と表示され、msize.cの88行目(下記)でブレーク。 retval = (size_t)HeapSize(_crtheap, 0, pblock); 領域の開放に失敗しているようだが、どうやら既にdeleteしたものをさらにdeleteしようとしたのがよくないようだ。 C++の仕様では、既に開放した領域をdeleteした場合の動作は未定義*1であるらしい。

    「ヒープが壊れていることが原因として考えられます。」の原因は二重deleteかも - ginpeiのブログ
    yowano
    yowano 2013/06/03
    deleteしても領域が開放されるだけで、ポインタがNULLになるわけではない。
  • C++ と const 参照 - NyaRuRuが地球にいたころ

    数年前,まだ私が C++ゲームを書いていたころ,深すぎる関数のネストは「一旦変数に入れ」て「読みやすくする」というコーディングスタイルにだいたい落ち着いていた.もちろん,「これは一旦別名を付けるだけで,変数に再代入する気はないよ」ということで const も付ける.ただあまり大きなデータのコピーは嫌だよねということで,戻り値が std::string や構造体の関数呼び出しを「一旦変数に入れる」ときは const 参照を好んで使っていた. A(B(C(a), b, D(E(c), d, e))); 「む,なんて読みにくいコード.ばらせよ」 const int target_id = C(a); const MessageBody& message_body = D(E(c), d, e); const Message& msg = B(target_id, b, message_bod

    C++ と const 参照 - NyaRuRuが地球にいたころ
    yowano
    yowano 2013/05/29
    関数内でconst 参照があったとき,考えるべきことは色々ある.確かにその参照は,初期化時と同じオブジェクトを指し続けてはいるだろうが,その中身まで同じとは限らない。
  • クラスオブジェクトの配列を使うときの注意点 - ソフトウェアエンジニア現役続行

    int型の配列を使うときは以下のようにします。これは問題ないですね。 int[] array = new int[10]; // (1) しかし自分で定義したクラスのオブジェクトの配列を使う場合は、同じようにしてもうまくいきません。 class NewClass{ int a; int b; } public static void main(String[] args) { NewClass[] dim = new NewClass[3]; // (2) dim[0].a = 1; dim[0].b = 10; dim[1].a = 2; dim[1].b = 20; dim[2].a = 3; dim[2].b = 30; } (1)と同様に(2)と書いたのに、これを実行するとNull Pointer Exceptionが発生してしまいます。 調べたところ、(2)は、オブジェクトを入れ

    クラスオブジェクトの配列を使うときの注意点 - ソフトウェアエンジニア現役続行
    yowano
    yowano 2013/04/17
    newでインスタンスを入れるための配列を作ったあとに、次はfor文を利用しnewでインスタンスを生成、配列にインスタンスを格納と、一つずつやっていかなければならない
  • 文字コード変換ミスによる文字化けパターンと想定される原因 - drk7jp

    とあるシステムでデータベースから引いてきたデータの表示が文字化けするという不具合がありました。 データベース内のデータとしては文字化けしていない状態で格納されていることはわかっていたので、どこかしらの文字変換で化けていることはわかっています。まずはどの誤変換により文字化けするのか原因切り分けのために、decode/encode の組み合わせによる文字化けパターン一覧を作りました。おかげさまでどのパターンに類するものか判別することができ、無事に改修することができました。 その話はまた別にするとして、今も昔も変わらず文字化けに悩む人は意外と多いと思います。誤変換結果一覧は原因解析の参考になると思い、記事としてまとめることにしました。 文字コード変換ミスによる文字化けパターンを可視化するプログラムと一覧表 まずは誤変換を生成する perl スクリプトです。プログラムはとっても簡単で、「文字化けで

  • Javaバイトコードの読み方 - プログラマーの脳みそ

    Javaのデバッグをしていて、ステップ実行中にステップインを繰り返したらソースコードのないところに行き当たったことがあるだろう。あるいはEclipseでF3キーでクラスやメソッド・フィールドの宣言元を辿っていってソースコードのないところに行き当たったことがあるだろう。 Eclipseの場合、"Class File Editor"というものが開く。そこにはJavaのバイトコードのニーモニックがズラズラと並んでいて、「これは読めないや、ワケが分からない」と投げ出してしまったりしていないだろうか。 怖がることはない。ちょっとコツを掴めばすぐに読めるようになる。 Class File Editorの開き方 自前のJavaクラスの場合、ビルドして出来上がったclassファイルを開く必要がある。"Package Explorer"だとclassファイルは隠されていて見えないのでWindow -> Sh

    Javaバイトコードの読み方 - プログラマーの脳みそ
  • プリントアウトした方が間違いに気づきやすいワケ - A Successful Failure

    2012年09月24日 プリントアウトした方が間違いに気づきやすいワケ Tweet もう随分前の話になるが、モニタ上で見るよりも、紙で確認したほうが間違いに気づきやすいのはなぜかという議論が盛り上がった。 どうして紙にプリントアウトした方が圧倒的に間違いに気付きやすいのか なぜ「画面」より「紙」のほうが間違いに気づきやすいのか? 考えうる理由についてはおおよそ挙げられているようだ。既出の論点の中では、身体性に関する指摘が重要であるように思われる。身体性とは、認知科学において近年注目されている概念で、身体という物理的存在が周囲の環境とインタラクションすることによって、学習や知識構築を行うことを指す。物理的な紙にプリントアウトされた情報を読むときには、を持つ、ページをめくる、文字をなぞるなどの物理的なインタラクションを行なっており、ページの厚みや重さといった電子情報には無い要素が間違い発見の

  • Google ChromeのJavaScriptデバッガの進化がすごい - os0x.blog

    Chrome版のFirebugことGoogle Chrome Developer Toolsですが、以前gihyoで解説したときよりさらに便利になっているので、少し紹介します(元はWebKitなので、そのうち(近いうちに)Safariでもそれなりに使えるようになるはずです)。 圧縮されたコードの整形 まず、目立つところからいきましょう。ちょうど先日更新されたChromeのdev版(12.0.742.0)に搭載されたばかりの機能で、minifyされているJavaScriptコードを読みやすいように整形して表示してくれるというものです(IE9の開発者ツールにも実装されている機能です)。 例えば、Google Analyticsのコードは圧縮されていて普通は読めません。 しかし、Chromeのデベロッパーツールなら、 このように整形してくれます。 やり方は簡単で、デベロッパーツールのScript

    Google ChromeのJavaScriptデバッガの進化がすごい - os0x.blog
  • 1