下の方にも書いてる事にもつながるんですが、内容が違うので分けました
早速内容ですが、デバッグの仕方は
1.どこで異常終了するかをTRACEやAfxMessageBox等を使用して探す
2.異常終了する部分の関数の周りをよく調べる
くらいしか思いつかず、今まで(去年から始めた新参者です)これでやってきました。
実際みなさんはどのようにデバッグしているのでしょう?
一般保護エラーの異常終了をするような場合で異常終了する部分がMFC内部の場合
実際の原因は自分で書いた部分のハズでそこを特定する為に
どのように調べていきますか?
下の方にも書いてる事になりますが、一般保護エラーの異常終了をするんですが
異常終了する部分がMFC内部で、どういう処理の最中に落ちるかはわかったんですが
実際の原因が検討もつかない状態でして、デバッグの方法が他にあればいいなあ
と思った次第です
WIN2000 SP2/VC6.0 SP5/MFC使用
よろしくお願いします
片っ端から怪しい所にブレークポイントをまきちらし変数に期待通りの値が入っているかどう
か確認する。
プログラムの動作を見て、問題の該当となってるところに当たりをつける。
ブレークポイントで止める。変数の値を見たり、変化を見る。
・・・とかしてます。
Debug版で例外が出たときは以下のURLような感じにしてます。
http://www24.cds.ne.jp/~neg/pro/neg/neg007.html
Release版の場合は以下のURLような方法も、、、
http://www24.cds.ne.jp/~neg/pro/piyo1/comp/apperr.html
MFC内部の場合は該当のMFCのソースを読む。
さかのぼって、呼び出してるところを確認する。
・・・ですかね。
自分は普段からくどいくらいASSERT()マクロを使います。
特に関数の先頭で引数検査したり、
配列の範囲を超えないようにしたり。
こうしておくと、潜在的な(なかなか症状として表れないような)
バグも排除できます。
確かにMFC内部で異常終了したときは99%自分のソースが悪いと思うんで、
そんな場合、NEGさんが指摘されているようにコールスタックで自分が作った関数まで
たどります。さらに関数内の代入や関数呼び出し部分での型や値の妥当性をチェックします。
大したプログラムを作っていないのでこの程度で原因を見つけることができてます。
でも、複数スレッドを扱っていた場合にはスレッド間の動作とデータ更新のタイミングも検討し
なくてはならないのでとても面倒でした。
また、MFC内部で終了したとき、どのクラスかなんとなく想像つくのであれば、そこらへんを重
点的にチェックすることもやります。
皆さん貴重な意見ありがとうございます
NEG(ねぐ)さんの「Release版の場合は以下のURLような方法も」
を参考に調べているんですが、問題の状況が違うので戸惑っています
よくある強制終了のダイアログの前に、
閉じると無視のボタンのある白いダイアログがでます。
で、閉じるを押して、強制終了のダイアログにきた時に詳細を押して
の一般保護違反です。
モジュール : GDI.EXE、アドレス : 0001:000084a4
以下略
が表示されます。
このような場合はmapファイルから
0001:000084a4に近いところを探していくのでしょうか?
0001:00007ed0 ?OnKeyDown@ 以下略
0001:000084e0 ?OnNcDestroy@ 以下略
が近いところです
このような手法の名前って何になりますか?
検索したいのですが、キーワードが思いつきません。
お願いします
>0001:000084a4に近いところを探していくのでしょうか?
たぶんそれでいいのではないかと思います。
>このような手法の名前って何になりますか?
こけたアドレスからリンクマップを参照してマシン語→ソースというのは昔のコンパイラ
からあるので、手法名というほどの名前はないような。
「リンクマップ」の参照???
「MAP ファイルを生成する」で検索するとひっかかるようです。
<関係ないのも多いが、、、(^_^;
ゴミレスかもしれませんが、
GDI関連のバグがWindowsUpdateにあったような気がします。
試しにパッチを当てて見られてはいかがでしょうか?
雑談掲示板 109 もご参考にしてください
皆さんありがとうございます
遅くなりすみません
少し進展はしましたが、まだ解決できないでいます。
ワトソン博士のログの見方がわかるようなサイト、書籍ってないでしょうか?
アセンブラを勉強しないといけないのはわかったんですが、
ログに
Trap 0d 41d4 - 一般保護エラー
eax=00000357 ebx=00009546 ecx=00000000 edx=00020974 esi=0000fb2e edi=00000000
eip=000028a3 esp=0000767c ebp=00007686 -- -- -- nv up EI pl ZR na PE nc
cs=0347 ss=3c4f ds=0357 es=087f fs=4217 gs=0000
DISPLAY(01):28a3:
>0347:000028a3 0fb45e12 lfs bx,dword ptr [bp+12]
とあったので
000028a3やlfs bx,dword ptr [bp+12]を
秀丸で正規表現を使用した検索してもヒットせず、どうしようか困っています
エラーが起きるのはwin98なのでwin98付属のワトソン博士にはヘルプも無いし
win2000とログが違うし。
愚痴っぽくなってしまいましたが、よろしくお願いします
IDEの アセンブラ混合モードデバックウィンドウは使っていないのですか
落ちた結果より落ちる直前アセンブラにブレーク貼れるよ!