意図と異なる動作をバグと呼ぶことが多い。意図通りに動かないソフトウェアなぞ全く役に立たないので、デバッグという作業は非常に大事な開発プロセスである。でも今までやっていたデバッグの作業は、クラッシュするまでステップオーバーし、printfとMessageBoxを元にtry&errorで繰り返しビルドするという単純なものだった。これじゃあイカンと思って、キッチリとした技術を学ぼうと思った。 以下本当にダラダラとした学習の記録 *link [#o75ed2ad] **Web [#i3c9951e] ***The Code Project [#se4e9f93] Toby Opfermanなる人が素晴らしい文章を書いている。コーディングの心構えなどには触れていないが、実際のデバッグの手続き、つまり「どういうソフトをどのように使ったら何がわかってどのように嬉しいか」について丁寧に解説している。基本的にデバッグはprintfに頼りきってる人(私)が見れば、世界がひとつ増える感じ。 -[[Debug Tutorial Part 1: Beginning Debugging Using CDB and NTSD:http://www.codeproject.com/debug/cdbntsd.asp]] -[[Debug Tutorial Part 2: The Stack:http://www.codeproject.com/debug/cdbntsd2.asp]] -[[Debug Tutorial Part 3: The Heap:http://www.codeproject.com/debug/cdbntsd3.asp]] -[[Debug Tutorial Part 4: Writing WINDBG Extensions:http://www.codeproject.com/debug/cdbntsd4.asp]] -[[Debug Tutorial Part 5: Handle Leaks:http://www.codeproject.com/debug/cdbntsd5.asp]] **書籍 [#w3b9b6fe] -[[Windowsプログラマのためのデバッグテクニック徹底解説:http://www.amazon.co.jp/exec/obidos/ASIN/4891001860/qid%3D1139467824/sr%3D8-2/ref%3Dsr%5F8%5Fxs%5Fap%5Fi2%5Fxgl14/250-8789442-714902/250-8789442-7149027]]を買って読んで、とりあえず奥の深さは良くわかったし、色々と知らない事が書いてはあったが、本当にイチから「デバッグって何?」みたいな事を知りたい人には多少敷居が高い。 *雑多メモ [#ofb25576] -VS.NET2003で、プロジェクトのプロパティからC/C++ ==> 全般 で、「警告レベル4」及び「警告をエラーとして扱う」の設定ができる。 *Visual C++ [#p2060131] -ウォッチで @err,hr を評価させると最新のエラーの内容がわかる。@errは最新のGetLastError値で、hrというのはそれを説明に変換してくれるフォーマット指定で、HRESULT型にも適用できる。 *WinDbg [#n9cf6e54] Microsoftが無償で提供しているデバッグ用のツール。上のToby OpfermanはVisual Studioのデバッガよりこちらを使えと言い、John Robbinsは相補的に使えと言っている。要は使うべきなのだろう。[[Debugging Tools for Windows:http://www.microsoft.com/whdc/devtools/debugging/default.mspx]]で入手できる **memo [#sabdf707] -バージョン6.6.03.5のものは、Windows 2000ではちょっとあやしい模様。"The call to LoadLibrary(ext) failed, Win32 error 127 "なるエラーが出た。ひとつ古いバージョン6.5.03.7だったらこの様なエラーは出なかった。参考:[[WinDbg 6.6.03.5 is now available for download in windbg:http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.windbg&tid=27057bbe-9fd6-4702-be42-0effaca5e98f&p=1]] -WinDBGは[[Windows Debuggers: Part 1: A WinDbg Tutorial:http://www.codeproject.com/debug/windbg_part1.asp]]なる記事がある。 **Symbol [#ec813c6f] いまいち理解が浅い。 ***作成 [#n7179591] John Robbinsは、Releaseビルドでもシンボルを組込めと主張している。Visual Studio 6でそうするためには、プロジェクトの設定で +C/C++ ==> 一般 ==> デバッグ情報 で「プログラムデータベースを使用」 +リンク ==> 一般 ==> デバッグ情報を生成する をチェック +リンク ==> プロジェクトオプション に /OPT:REF を追加 で良いようだ。シンボルは拡張子がPDBのファイルに格納される。 ***MAP [#j9ca73f1] シンボルのテキストファイル版っていう理解でいいの?いずれにせよ作った方がいいみたい。プロジェクトの設定で、 +リンク ==> プロジェクトオプション に /MAPINFO:EXPORTS と /MAPINFO:LINES を追加 +リンク ==> カテゴリ でデバッグを選択し、 「MAPファイルを生成する」をチェック すれば良いみたい。[[Finding crash information using the MAP file - The Code Project - Debug tips:http://www.codeproject.com/debug/mapfile.asp]]という記事にも同様なことが書いてある。 ***パスとサーバ [#sb2dfb1c] シンボルを参照するパスは、とりあえず File ==> Symbol File Path から以下の様に指定できるみたい。 SRV*c:\temp*http://msdl.microsoft.com/download/symbols httpとあるのはシンボルサーバというやつらしく、必要な時にOSのシンボルをリモートから取得してくれるみたい。_NT_SYMBOL_PATHなる環境変数でもいいようだ。自プログラムのシンボルファイルは、.exeと同じディレクトリに置いてもいいのか? ***コマンドによる参照 [#l56cd41f] xなるコマンドで見えた。ワイルドカードが使えるみたい。モジュール名の右隣に (pdb symbol) とあるのは、ちゃんとPDBから読めましたという意味なのだろう。 (deferred) とあるのは lazy mode(Deferred Symbol Loading)というやつなのだろう。 ***シンボル名シンタックス [#q0cfe385] "Debugging Tools for Windows"のヘルプの"Symbol Syntax and Symbol Matching"という項目に書いてあった。大文字小文字の区別は無く、モジュール名とシンボル名は'!'で区切り、シンボル名はアルファベットか'_'か'$'か'?'で初まるのだそうだ。debugtestをモジュール名とすると debugtest!myfunc debugtest!_c_exit みたいになる。