情報科学屋さんを目指す人のメモ(FC2ブログ版)

何かのやり方や、問題の解決方法をどんどんメモするブログ。そんな大学院生の活動「キャッシュ」に誰かがヒットしてくれることを祈って。

ブログ内検索

スポンサーサイト このエントリーを含むはてなブックマーク

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 | 編集

EPICのデバッグ実行時に1行目で一時停止しないようにする このエントリーを含むはてなブックマーク

EclipseプラグインEPICのデバッグ実行時に1行目で一時停止するのが初期設定なので、それを解除するための設定メモ。

Preference>Perl EPICの、「Suspend debugger at first statement」のチェックをオフにすればいい。

スポンサーサイト
Eclipse | コメント:0 | トラックバック:0 | 編集

アプリケーションの特定にSpy++ このエントリーを含むはてなブックマーク

突然表示されるエラーメッセージや、アプリケーションから間接的に起動された別のアプリケーション。エラーを起こしたプログラムは何なのか、実行ファイルはどこの何というファイルなのか、表示されている画面を見ても、特定できないことがあります。

そんなときに使える、「Spy++」というツールがあります。

今までWebページ上で見かけることはあっても、使ってはいませんでした。使ってみると便利なのでメモ。

Spy++

Spy++は、Visual Studioの一部というか、同時にインストールされるツールのうちの一つです。その他のツールには、errlook.exeなどがあります。

Spy++は、実行ファイルを特定するのに便利ですが、Spy++自身の実行ファイル名は、spyxx.exeです。Spy++の場所は、

C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\spyxx.exe
(ただし、環境はWindows Vista SP2, Visual Studio 2008)
です。少しわかりにくいというか、紛らわしかったりするので、"C:\Program Files"内を"spyxx.exe"というファイル名で検索するとすぐ見つかると思います。

Spy++の使い方

利用方法ですが、ダブルクリックで起動し、「スパイ(S)>ウィンドウ検索(F)...」で、「ウィンドウ検索」ダイアログを表示させ、中央にある「ターゲットマークの画像」を目的のアプリケーション画面やダイアログにドラッグアンドドロップします。すると、「ハンドル」のテキストボックスにそのハンドルが入力されます。

そして、OKをクリックすると、「プロパティ インスペクタ」が表示されるので、「プロセス」タブを選択し、「プロセス ID:」の右に表示されている数字をクリックします。

すると今度は「プロセス プロパティ」が表示されるので、「モジュール名」をメモしますメモしなくても、表示しっぱなしでOK

続いて、タスクマネージャを「Shift + Ctrl + Esc」等で起動します。「プロセス」タブを選択した状態で「表示(V)>列の選択(S)...」で表示される「プロセス ページの列の選択」ダイアログで、「イメージパス名」にチェックを入れてOKをクリックして閉じます。あとは、プロセスタブ中の「イメージ名」の中から先ほどメモった「モジュール名」を探し、該当する「イメージ パス名」を見つけます。

このイメージ パス名が、ウィンドウを表示しているアプリケーションの正体です。

実行ファイルパスを特定できたら

Spy++で、とりあえずファイルパス名が分かったら、その実行ファイル名でWeb上を検索しましょう。

名前が分からないと満足に検索もできない」の記事で紹介したように、調べたいものの名前が分からないと、検索できません。Spy++を使うことによって、検索したいものの名前を見つけることができました。あとは、検索で関連情報を見つけてください。

Spy++便利ですね。

ひなた先生が教えるデバッグが256倍速くなるテクニック
Windowsデバッグの極意 ツールを使いこなして、バグハント!
Debug Hacks -デバッグを極めるテクニック&ツール

Visual Studio | コメント:0 | トラックバック:0 | 編集

ハンドルされるかにかかわらず、例外発生時に停止する方法 このエントリーを含むはてなブックマーク

今回はVisual Studio でも、デバッグについて。

問題:例外で一時停止してくれない

Visual Studioでデバッグ実行すると、 例外がハンドルされないとき、

ArgumentNullException が発生しました。

のような表示がされ、一時停止されます。

しかし、try-catchで、例外を正しくハンドルしていると、 例外が発生しても、

'System.ArgumentNullException' の初回例外が mscorlib.dll で発生しました。

のような一行が出力ウィンドウに表示されるのみです。

ライブラリの内部などで例外が発生していると、発生していることのみが表示され、どの行から発生したかが分からず、困ってしまいます。

対策:一時停止するように設定する

対策方法は、「デバッグ(D)>例外...(X)」から例外ウィンドウを表示し、 表示された表の「スローされるとき(T)」にチェックを入れるだけです。

すると、例外が発生したら必ず一時停止してくれます。

ゲーム作りで学ぶVisual C# 2008入門
はじめてのVisual Studio 2008
はじめてのVisual Studio 2008―Microsoft Windows用統合開発環境(IDE)の基礎知識から応用まで

Visual Studio | コメント:0 | トラックバック:0 | 編集

C言語のfree関数の内部でエラー このエントリーを含むはてなブックマーク

eclipseでC言語のプログラムをデバッグ実行してみるとfree関数の内部でエラーを起こしているようでした。スタックトレースはこんな感じ。

Thread[1](Suspended: Signal 'SIGABRT' received. Description: Aborted.)
14 _kernel_vsyscall() 0xb7f4a410
13 raise() 0xb7e02085
12 abort() 0xb7e03a01
11 0xb733ab7c
10 0xb7e42a85
9 free(9 0xb7e754f0
...

はて、何でだろう。二重にfreeしてるのか?とも思いましたが、そうではなかったみたいです。

問題のコードはだいたいこんな感じ

char *str = (char *) malloc(sizeof(char) * 4; char *str2 = NULL; strcpy(str, "abc"); str2 = str + 2; free(str2);

なんかだいぶ適当な例ですが、ポイントは、mallocから受け取ったアドレス(str)から ずれたアドレス(str2)でフリー使用としているということです。

フリーで渡すべきポインタ型の変数はmallocで確保したメモリ領域の先頭である必要があるので、そのメモリ領域の途中をfree関数に渡してはいけません。っていうことみたいです。

大したことじゃないんですけど、デバッグって大変ですね。っていうことです。

実践 デバッグ技法 ―GDB、DDD、Eclipseによるデバッギング
Debug Hacks -デバッグを極めるテクニック&ツール
C言語 デバッグ完全解説 (Gihyo Technology)

C言語 | コメント:0 | トラックバック:0 | 編集
 | HOME | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。