不正アクセスエラーのデバッグ方法について – プログラミング – Home

不正アクセスエラーのデバッグ方法につい...
 
通知
すべてクリア

[解決済] 不正アクセスエラーのデバッグ方法について


spumoni
 spumoni
(@spumoni)
ゲスト
結合: 12年前
投稿: 5
Topic starter  

環境
 OS Windows7
Visual studio 2010 pro
 MFC使用

こんにちは

タイトルの通り、アプリ動作中における不正アクセスについて悩んでいます。

症状としては、ボタンのイベント内でファイルダイアログを開き、適当にファイルを
選択して、「OK」を押す。その際、特にそのファイルに対する処理はしていません。
(一応、「OK」ボタンを押すだけで症状が発生するようなので処理を抜きました。)

「OK」ボタンを押すだけでと書きましたが、実際には即時ではなく、その後適当な
時間経つと不正アクセスエラーが出るという感じです。

その際のエラーログとファイルダイアログ関連のコードは以下の通りです。

★コード
void CHOGEDlg::OnBnClickedCmdLdButton()
{
CString filter(_T(コマンド ファイル (*.txt)|*.txt||));
CFileDialog dlg(true, NULL, NULL, OFN_HIDEREADONLY, filter);

if(dlg.DoModal() == IDOK){
  // 今は無処理です。
}
}

★エラー
hoge.exe の 0x76f1b9bc で初回の例外が発生しました: 0x80010108: 起動されたオブジ
ェクトはクライアントから切断されました。
hoge.exe の 0x76f1b9bc で初回の例外が発生しました: 0x80010108: 起動されたオブジ
ェクトはクライアントから切断されました。
hoge.exe の 0x76f1b9bc で初回の例外が発生しました: 0x80010108: 起動されたオブジ
ェクトはクライアントから切断されました。
hoge.exe の 0x76f1b9bc で初回の例外が発生しました: 0x80010108: 起動されたオブジ
ェクトはクライアントから切断されました。
hoge.exe の 0x752ec99e で初回の例外が発生しました: 0xC0000005: 場所 0xfeeefeee
を読み込み中にアクセス違反が発生しました。
hoge.exe の 0x779515de でハンドルされていない例外が発生しました: 0xC0000005: 場
所 0xfeeefeee を読み込み中にアクセス違反が発生しました。

不正アクセス発生前の「クライアントから切断されました。」の箇所が影響している
ように感じたのですが、どう調べるべきなのかわかりません。
ちなみに、コード上ではデバッグのためにほとんどの制御をはずしているため、
ボタンが押されるまでは、setlocale関数ぐらいしか呼んでいません。

何か参考になりそうなものでも構いませんので、知恵をお借りしたいです。

よろしくお願いします。


引用未解決
トピックタグ
spumoni
 spumoni
(@spumoni)
ゲスト
結合: 12年前
投稿: 5
Topic starter  

追記です。

MFCではダイログベースで開発しています。

また、「OK」ボタンからエラー発生までの時間は3~5分程度です。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

0xfeeefeee を検索すると
HeapFree で処分された後のヒープ領域がこの値で埋められている、とわかる。
ということは「処分済みヒープへのポインタを誰かが使っている」ということだ。

状況がよくわからんのだが
1.CFileDialog を開き OK の後、3分放置で症状が出る、ということかな?
(CFileDialog を開かなければ症状が出ない、ということ)
2.CFileDialog を開かなくても、3分放置で症状が出る、ということかな?
もし 2. なら CFileDialog は関係ないと思われるけど。

とりあえず CFileDialog に関してはまる罠は
1. OK を押すと [カレントディレクトリ] が移ってしまうこと
2. XP->vista の際に COM 化がされており CFileDialog の中身は別物になったこと  
 コンストラクタ引数に bVisualStyle が増えてるくらい違う。

VS2010 は SP1 をあてておかないと使い物にならないっぽいのでその辺を確認。


返信引用
spumoni
 spumoni
(@spumoni)
ゲスト
結合: 12年前
投稿: 5
Topic starter  

返答ありがとうございます。

>状況がよくわからんのだが
>1.CFileDialog を開き OK の後、3分放置で症状が出る、ということかな?
>(CFileDialog を開かなければ症状が出ない、ということ)
>2.CFileDialog を開かなくても、3分放置で症状が出る、ということかな?
>もし 2. なら CFileDialog は関係ないと思われるけど。
の件は1.の症状です。しかし、CFileDialogを開かなくても変わりに同じような
タイミングで以下の出力があります。

スレッド 'Win32 スレッド' (0x1af0) はコード 0 (0x0) で終了しました。

追加で調べていましたが、「キャンセル」しても出るようなので、DoModalだけでも
何かしらの原因が発生しているように思います。

SP1はあててあります。

>とりあえず CFileDialog に関してはまる罠は
>1. OK を押すと [カレントディレクトリ] が移ってしまうこと
>2. XP->vista の際に COM 化がされており CFileDialog の中身は別物になったこと  
> コンストラクタ引数に bVisualStyle が増えてるくらい違う。
2.の部分で追加された引数が気になったため、デフォルトの1から0に変更したところ
症状が発生しなくなりました。
発生しなくても原因がよくわからないので、引き続き調査します。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

> スレッド 'Win32 スレッド' (0x1af0) はコード 0 (0x0) で終了しました。
この表示は正常。
(誰かが暗黙にスレッドを作っていて、そのスレッドが正しく終了している)

CFileDialog を呼び出すと、その中で暗黙に複数個のスレッドが作られる
(XPの場合で最低3個 Vista/7 の場合はもっと多い)
CFileDialog を閉じたときすぐに数個+
CFileDialog を閉じた後数分後に数個の
スレッド終了メッセージが表示される(表示があるのが正常)
気にしなくてよいっぽい。

bVisualStyle=0 にして症状が出なくなったのなら COM 系の初期化・終了処理にて
なにかあるのだと思われる (CFileDialog が全部自分で面倒見てるはずなんだけど)


返信引用
spumoni
 spumoni
(@spumoni)
ゲスト
結合: 12年前
投稿: 5
Topic starter  

>> スレッド 'Win32 スレッド' (0x1af0) はコード 0 (0x0) で終了しました。
>この表示は正常。
>(誰かが暗黙にスレッドを作っていて、そのスレッドが正しく終了している)

>CFileDialog を呼び出すと、その中で暗黙に複数個のスレッドが作られる
>(XPの場合で最低3個 Vista/7 の場合はもっと多い)
>CFileDialog を閉じたときすぐに数個+
>CFileDialog を閉じた後数分後に数個の
>スレッド終了メッセージが表示される(表示があるのが正常)
>気にしなくてよいっぽい。
了解です。ありがとうございます。

>bVisualStyle=0 にして症状が出なくなったのなら COM 系の初期化・終了処理にて
>なにかあるのだと思われる (CFileDialog が全部自分で面倒見てるはずなんだけど)
この件ですが、会社のPCということもあり、セキュリティなどがかかっていますが、
何か原因することがあるでしょうか?
特に見た目にこだわることはありませんし、差もあまり感じないので、
解決が難しいようならこのままでいこうと考えています。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

3分程度でほにゃらら起こるってのは、

CFileDialog を連続して使う場合に、毎回 COM の再ロードを行うと遅いので
・3分以内はメモリ中に CFileDialog の内部処理を残しておく(コードやデータを)
・3分使わなかったらメモリを返すため DLL をアンロードするなどの後始末をする
のであろうと思われる。で、エラーになるのは、誰かが
アンロード後の DLL 中の関数を呼んでいたり処分済みデータをアクセスしたり
しているのだろうと推定される。
それが Microsoft 責任範囲なのか spumoni 氏の責任範囲なのか、はたまた
ウイルス対策ソフト等の責任範囲なのかは、今の時点では判明していないわけだ。
# 調査して原因がわかったところで、他者有責だと直しようが無かったりするし・・・

すでに掲げられているコードの範囲に悪い場所が無いし、
bVisualStyle を変更すると CFileDialog の内部処理はごっそり違うものになるので
コレだけで直る+見た目を気にしないのなら、一番安価で適切な解決策だと思う。
# 他者のバグを探るより、時間はもっと有意義に使いたいよね


返信引用
spumoni
 spumoni
(@spumoni)
ゲスト
結合: 12年前
投稿: 5
Topic starter  

現象は発生しなくなったため、解決とさせていただきたいと思います。

tetrapod さん丁寧な回答ありがとうございました。
私はWin7やVS2010はあまり慣れておらず、今までXPとVC2003を使用していたため
今回のコードも以前と同じ要領で書いていました。
環境が結構変わっていて、API側もかなり変化しているようなので
これを機会に今までのコードの見直しも行おうと思います。

また解決できない問題が起こった際はよろしくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました