ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

Boland C++でプログラミングしています。
作成したEXEを使っていますと、Windows 2000proでは、ほとんどなかったのですが、Windows XPでは、アプリケーションエラー(アクセス違反)が数日に1回の割合ででます。

そこで、ワトソン博士のログを解析して、原因を追及したいのですが、ワトソン博士のログの解析について、いいサイトや書籍があったら、教えて下さい。

また、Windows2000とXPでの互換性の問題かもしれないと考えたのですが、どのようなものがあるのでしょうか。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

Microsoftのサポート技術情報に以下が有ります。


参考まで。

メモリ ダンプ後にブルー スクリーン情報を収集する
http://support.microsoft.com/default.aspx?scid=k …

Windows XP でメモリ ダンプ後に情報を収集する方法
http://support.microsoft.com/default.aspx?scid=k …
    • good
    • 0

OSのヘルプにログの内容(Windows2000ではあった)説明


があると思いますけど。。。

あとはmapファイルとにらめっこかな。。。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qアプリケーション終了時例外エラー(アクセス違反)の調査方法について

大変困っています。

アプリケーションが終了するときに「アクセス違反」がワトソン博士によって取得されています。
当方アプリケーションなどに弱く、解決策の想像が付きません。どなたかご教授お願いいたします。

<解決策例>
・どういったスキルを持った人にどの様な調査を進めさせれば良いのか。。。
・以前同様な事があり原因は○○だった
・恐らく○○だろう
 など、お願いいたします。

<ユーザ報告>
処理終了し、画面が消えたところでワトソン博士のメッセージが表示された

<ログ抜粋>
例外番号c0000005(アクセス違反)

ファンクション:RtlDestroyHeap
~略~
フォールト → 77f6d672 8908 mov [eax],ecx ds:09000001=00000000

<備考>
開発環境:MSVC6.0
動作環境:Windows NT4.0 SP6a
発生頻度:2回/年
使用頻度:2~3回/(平日)

以上、よろしくお願いします。

Aベストアンサー

発生頻度が年2回というのはなかなか厳しい条件ですね。

さて・・・

「私であれば、次の手順で調査を行います。」という書き始めで延々とデバッグ方法を書いていたのですが、書き終わってからちょっとGoogleで検索したら、ひょっとするとちょうど質問者さんのトラブルと同じかもしれない現象がMicrosoftのKBにありました。

場所はここです: http://support.microsoft.com/kb/168006/ja

要点をかいつまんで書くと、MSVCRT/MFCのDLLのバージョン不整合でエラーが発生することがある、という内容です。KB自体は特定のアプリケーションについて書かれていますが、記述されている現象と原因の関係から考えるに、他のアプリケーションでも同様の現象が発生すると思われます。

さてさて。

せっかく書いた文章を捨てるのがもったいないので(貧乏性)、邪魔かもしれませんが下に続けることにします。もし上のKBの内容がそれらしいようであれば、読み飛ばしてください。

========

私であれば、次の手順で調査を行います。

1. MAPファイル、CODファイル作成

「ワトソン博士のログを取得した際に実行していたEXEファイル」をビルドした際、一緒にMAPファイルやCODファイル(リスティングファイル)を作成していれば、そのファイルを用意しておきます。

もし作成していない場合は、「ワトソン博士のログを取得したEXEファイル」と、バイナリレベルで全く同じEXEファイル(バイト単位で比較すると、ファイルに埋め込まれたタイムスタンプ・チェックサム以外は一致する)が作成可能かどうか調べます。(ビルドに必要なソースファイルやビルドオプションに変更を加えていなければ作成可能です。)

作成可能であれば、コンパイルオプションに「リスティングファイルタイプ:マシン語コードとソースを含む」、リンクオプションに「MAPファイル作成」を追加してEXEを再作成してください。これで、「ワトソン博士のログを取得した際に実行していたEXEファイル」に対応するMAPファイルとCODファイルが得られます。

2. エラー発生行を特定

ワトソン博士のログがどれだけ取れているかにもよりますが、スタックダンプが含まれていればたいていエラー発生行を特定できます。

まず「フォールト->」が含まれる逆アセンブルリストを探します。次に、その下にある「スタックバックトレース」を探します。

スタックバックトレースを上から下に順にたどっていくと、そのうち「ReturnAd」(リターンアドレス)がアプリケーションのアドレス範囲(VC++6の標準オプション設定を変更していなければ0x00400000~)に入るところが出てきます。見つかったら、そのアドレスの直前にあるcall命令が例外を発生させたAPIを直接呼び出している場所です。

さて、仮にリターンアドレスが0x00401234だったとします。そうしたら、次はMAPファイルを見てこのアドレスがどの関数に属しているか探します。ちょうど0x00401234というアドレスは見つからないでしょうけれども、これに近いアドレスは見つかるはずです。そのアドレスに対応する関数名もMAPファイルにあります。

次はその関数名をCODファイルから探します。見つかったら、MAPファイルにあるアドレスがCODファイルにあるマシン語コードの先頭アドレスになるので、そこからリターンアドレス0x00401234に対応するはずの場所まで順番にアドレスを辿っていきます。関数の先頭アドレスが0x00401200であれば、0x34バイト先を探すわけです。

そうすると、その探した場所にある命令の直前の命令がcall命令になっているはずです。CODファイルには、その場所のC++ソースでの行番号とソース文もコメントとして入っているはずなので、あとは対応するソースをよーく見てエラーの見当をつけてください。

アセンブラの知識があれば、そこでcallを使った(他の関数を呼び出した)ときの引数の内容もある程度分かります。(ポインタ渡しだと、そのポインタの先の内容までは分かりませんが。)

3. 置き換え用EXEファイルと対応するMAPファイル作成

これ以降は将来への備えです。

コンパイルオプションでデバッグ情報を「プログラムデータベースを使用」、リスティングファイルタイプを「マシン語コードとソースを含む」、リンクオプションで「MAPファイルを作成する」、デバッグ情報「他の種類」を追加してビルドし、出来たEXEファイルを本番用として使用します。同時に作成されるMAPファイル、CODファイル、PDBファイルは保管しておきます。

MAPファイル、CODファイルの使い方は上記2.のとおりです。PDBファイルは、もし完全なクラッシュダンプが取得できればWinDbgを使って事後ソースレベルデバッグが可能になりデバッグ作業が非常に楽になるので、念のため取っておきます。

4. ワトソン博士のオプション変更

drwtsn32.exeを起動し、「クラッシュダンプファイルの作成」をチェックします。(デフォルトは、チェックが入っています。)

クラッシュダンプファイルとEXEとPDBがあればWinDbgで事後ソースレベルデバッグができます。(いわゆるポストモーテムデバッグです。UNIX系でコアダンプしたコアをデバッガで読み込んでデバッグするのと同じ種類のものです。)


普段何とも思わずに行っていることでも、文章にすると長いですね・・・

えーと、「どういうスキルを持った人に調査させればいいか」については、上記の内容を読んで『なるほど!』と言える人でしょうか。

参考URL:http://support.microsoft.com/kb/168006/ja

発生頻度が年2回というのはなかなか厳しい条件ですね。

さて・・・

「私であれば、次の手順で調査を行います。」という書き始めで延々とデバッグ方法を書いていたのですが、書き終わってからちょっとGoogleで検索したら、ひょっとするとちょうど質問者さんのトラブルと同じかもしれない現象がMicrosoftのKBにありました。

場所はここです: http://support.microsoft.com/kb/168006/ja

要点をかいつまんで書くと、MSVCRT/MFCのDLLのバージョン不整合でエラーが発生することがある、という内容です。KB...続きを読む

Qオブジェクト(dll)のレジストリ登録について

いつもお世話になっております。

dllの使い方について教えてください。

vb5.0で開発を進めているのですが、
dllを呼び出す際に、レジストリ登録を
しなければいけないのでしょうか?

いくつかのサイトでは、参照設定際すれば、
実行できているようです。。

実行環境では、レジストリ登録しないと
動かない場合があるということでしょうか?

ご教授、よろしくお願いします。

Aベストアンサー

何のDLLか、によるが。

・あなたがVB5.0で作成したDLLを、開発に使ったマシン以外で使う。
→該当するマシンでレジストリに登録する必要があります。

・あなたがVB5.0で開発を行うにあたり使用するDLLを開発に使ったマシン以外で使う。
→VB5.0で参照設定できるのであれば、それと同じ方法で該当するマシンにDLLをインストールすれば同様にレジストリに登録済みとなる事でしょう。

よくわかんなければ次のようにしてみれば良いだろう。コマンドプロンプトを開いて
C:\>regsvr32 hogehoge.dll
これで「Successful」と出ればActiveX DLLだ。エントリポイントが見つかりません云々と言われたらそれはWin32ネイティブDLLという事。登録に失敗して環境を壊すという事はないのでとりあえず登録を試みてみれば良いのではないかな。

現在では大きく分けてDLLは3つある。
・Win32ネイティブDLL:レジストリ登録不要。パスの通った所に配置する。
・ActiveX DLL:レジストリ情報によって呼び出すDLL。レジストリに登録する。インプロセスCOMサーバと言っても差し支えないかもしれないがあるかもしれない。
・Microsoft .Net アセンブリ:レジストリの登録は不要。単純に実行ファイルと同じパスに配置するか、.Netにおけるレジストリといえるグローバルアセンブリキャッシュに登録する。

何のDLLか、によるが。

・あなたがVB5.0で作成したDLLを、開発に使ったマシン以外で使う。
→該当するマシンでレジストリに登録する必要があります。

・あなたがVB5.0で開発を行うにあたり使用するDLLを開発に使ったマシン以外で使う。
→VB5.0で参照設定できるのであれば、それと同じ方法で該当するマシンにDLLをインストールすれば同様にレジストリに登録済みとなる事でしょう。

よくわかんなければ次のようにしてみれば良いだろう。コマンドプロンプトを開いて
C:\>regsvr32 hogehoge.dll
これで「S...続きを読む

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Q外部依存関係について

外部依存関係に追加する場合について
お教えください。
外部依存関係フォルダに既存ヘッダファイルを
追加するにはどの様にすればよろしいのでしょうか。
申し訳ございませんがお教えください。
eMbedded VC++ 4.0で開発しております。

宜しくお願いいたします。

Aベストアンサー

 こんばんは。

 +Source Files
 +Header Files
 +Resource Files
 +外部依存関係 ←ココに追加したいと言う事でしょうか? 

 ヘッダをインクルードすると追加されます。中には追加されない場合もある見たいなのですが、其の理由迄はチョッと分かりません。
 此方が確認で使用したのは、MSVC++6.0です(恐らく此の部分に関しては、違いが無いと思う)。


人気Q&Aランキング