デバッグで原因を特定する方法 – プログラミング – Home

デバッグで原因を特定する方法
 
通知
すべてクリア

[解決済] デバッグで原因を特定する方法


ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

WinXP、VC++.net 2003、COMです。
よろしくお願いいたします。

デバッグ中に「hoge.exe の 0x7c941230 でハンドルされていない例外が発生しまし
た : ユーザー設定のブレークポイント」というダイアログが表示されます。

出力を見ると「HEAP[hoge.exe]: Invalid Address specified to RtlSizeHeap(
00150000, 055ABDE8 )」と出ています。

ダイアログの中断を押すと「現在の場所のソースコードを表示できません。混合モード
の表示」のダイアログが表示され、呼び出し履歴をみても「ntdll.dll! 7c841230()」
「ole32.dll! 7698d420()」などのアドレスが表示されているだけです。

デバッグで原因を特定するためには、どのような方法がありますでしょうか?
ご教示ください。


引用未解決
トピックタグ
とーりすがり
 とーりすがり
(@とーりすがり)
ゲスト
結合: 18年前
投稿: 29
 

2003はもう覚えてないけど…
「呼び出し履歴」か「コールスタック」みたいな名前の
デバッグ用ウインドウがあるからそれを開いてください
そこにそのエラーが発生した段階での呼び出し履歴がでるので
それを逆にたどってみてください。


返信引用
+
 +
(@ )
ゲスト
結合: 17年前
投稿: 50
 

その手のメモリエラーは、エラーが出てからでは後の祭り。
場所の特定など不可能です。例え特定できても原因まで遡るは人間にはムリかと。
そんなことは、神と呼ばれる人のみw

デバックでアプリを正常に終了させたとき、
Detected memory leaks!
Dumping objects ->

こんなメッセージでてませんか?
そのメッセージは、重要です無視しないように。
初めての方ってよくわからないメッセージを無視するからねぇ


返信引用
とーりすがり
 とーりすがり
(@とーりすがり)
ゲスト
結合: 18年前
投稿: 29
 

履歴に出てないって書いてありましたね
さっきの書き込みは無視してください…


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

とーりすがりさん、+さん、レスありがとうございます。

> 「呼び出し履歴」か「コールスタック」みたいな名前の
> デバッグ用ウインドウがあるからそれを開いてください

質問に書きましたが、呼び出し履歴をみても、
アセンブラのアドレスしかありませんでしが。

> その手のメモリエラーは、エラーが出てからでは後の祭り。
> 場所の特定など不可能です。例え特定できても原因まで遡るは人間にはムリかと。
> そんなことは、神と呼ばれる人のみw

やっぱりそうですよね。。
7c841230()は、プログラムを中断させる命令の場所なので、
いつかどこかで何かやってしまっているのを見つける手段が
何かあればと思ったのですが。。
プログラムが膨大なもので。。。

> デバックでアプリを正常に終了させたとき、
> Detected memory leaks!
> Dumping objects ->

出ていませんです。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

そうなるとそれこそTRACEとかOutputDebugStringとかの関数を使って
何処まで動いているのかを見るくらいしか手が無いかなぁ。
後は、ソースをどんどん削って行って問題が起こる最小限の状況を絞り込むか。
ただ、ソースを削り込んじゃうと不正アクセスをした後の動作が変わったりするので
なかなか一筋縄では行かないのですけれどね。

大体の検討がついたらひたすらソースを追いかけるしかないかもです。
ローカル変数の領域破壊から始まってシステム領域に飛び火なんて事もざらにありますか
らねぇ。


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

PATIOさん、レスありがとうございます。

そうですよね。
ソースをどんどん削っていく方法で格闘してみます。

ちなみにRtlSizeHeap( 00150000, 055ABDE8 )の
「055ABDE8」はアドレスですが、
「00150000」にはどんな意味があるのかわかる方はいらっしゃいますか?

今回は必ず「00150000」ですが、
Webで調べると「00130000」や「00140000」があるようです。

今回発生した例外で、行おうとしていた操作などの
識別であればヒントになるかなと思っています。


返信引用
ふー
 ふー
(@ふー)
ゲスト
結合: 23年前
投稿: 28
 

WindowsXPのシンボル情報を入れると幸せになれるかも知れません。

Windows XP Service Pack 2 x86 retail symbols, all languages
http://msdl.microsoft.com/download/symbols/packages/windowsxp/WindowsXP-KB835935-SP2-Symbols.exe


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

ふーさん、レスありがとうございます。

面白そうですね。
来週試してみます。


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

> ちなみにRtlSizeHeap( 00150000, 055ABDE8 )の
> 「055ABDE8」はアドレスですが、
> 「00150000」にはどんな意味があるのかわかる方はいらっしゃいますか?
> 今回は必ず「00150000」ですが、
> Webで調べると「00130000」や「00140000」があるようです。

HeapHandleのようです。
GetProcessHeap()すると近い値が取れますし、
GetProcessHeaps()すると、おそらく含まれているかと…


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

瀬戸っぷさん、レスありがとうございます。

ソースを削っていったのですが、いつまでも発生するので、そのOCXのみを組み込んだ最
小限のものを作成して試してみたのですが、やっぱり発生しました。

ちょっと特殊な操作を伴うので、その再現方法をまとめてOCXベンダに報告することにし
ます。

みなさま、ありがとうございました。


返信引用
ひろ
 ひろ
(@ひろ)
ゲスト
結合: 24年前
投稿: 149
Topic starter  

解決です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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