User Break point call from 0xXXXXXXX?

[戻る]
Norikichi 2007/01/29(月) 10:42:38
VC++(Visual stadio6.0)でアプリ作成しています。
Debugモードで終了時に”UserBreakPoint Call From 0xXXXXXXXXX”
がでるようになりました。
こんなところにBreakPointを設定した覚えも、Edit-BreakPointで見ても
BreakPointは設定されていません。
このエラーは何なのでしょうか?
また、回避方法はありませんか?
よろしくお願いします。

PATIO 2007/01/29(月) 13:20:47
これだけでは良くわかりませんけれど、
プログラミングミスでメモリ上のデータが壊されていて
結果的にBreakPointコールに形になっているのかも。
たしか、BreakPointって言うのは止めたい場所に
BreakPointを示すバイナリ値を埋め込むと言うことだったと
思うのでメモリ破壊が結果的にそのバイナリ値に相当する物を
埋め込むような形になっているとありえない話では無いかなと思います。

シングルトンパターンを使っているとデバッガ起動時に
どうしてもブレイクが発生すると言うのは聞いた事がありますが、
終了時にそういう事が起こると言う話は聞いた事が無いです。

Ban 2007/01/29(月) 14:09:35
VCのデバッグモードは、不定領域に0xCC(IntelのINT3命令:ブレイクポイント)を埋め込むように
なってますので、多分どこか壊して不正参照してるのでしょう。

多分、破棄済みのオブジェクトにデストラクタが走ってるとか、そんなところ。

Norikichi 2007/01/29(月) 14:27:02
View->Debug Window->Call Stackで見れは、呼出し元がわかると思ったのですがなんのこ
とやら。
どこか悪いのかさっぱりわかりません。
ご教授お願いします。

HEAP[MyApp.exe]: HEAP: Free Heap block 387898 modified at 3878f4 after it was 
freed

7c941230 INT 3 ←PC
7c941230 res

NTDLL! 7c941230()
NTDLL! 7c989b79()
NTDLL! 7c9669a9()
NTDLL! 7c9ae062()
NTDLL! 7c98a5d0()
NTDLL! 7c9668ad()
_free_base(void * 0x00386ee8) line 60
_free_dbg_lk(void * 0x00386f08, int 0x00000004) line 1083 + 9 bytes
_free_dbg(void * 0x00386f08, int 0x00000004) line 970 + 13 bytes
CObject::operator delete(void * 0x00386f08) line 46 + 12 bytes
CMainFrame::`scalar deleting destructor'(unsigned int 0x00000001) + 56 bytes
CFrameWnd::PostNcDestroy() line 210 + 31 bytes
CWnd::OnNcDestroy() line 843
CWnd::OnWndMsg(unsigned int 0x00000082, unsigned int 0x00000000, long 
0x00000000, long * 0x0012f480) line 1825
CWnd::WindowProc(unsigned int 0x00000082, unsigned int 0x00000000, long 
0x00000000) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00386f08 {CWnd hWnd=0xdddddddd}, HWND__ * 0x003f08e0, 
unsigned int 0x00000082, unsigned int 0x00000000, long 0x00000000) line 215 + 
26 bytes
AfxWndProc(HWND__ * 0x003f08e0, unsigned int 0x00000082, unsigned int 
0x00000000, long 0x00000000) line 368
AfxWndProcBase(HWND__ * 0x003f08e0, unsigned int 0x00000082, unsigned int 
0x00000000, long 0x00000000) line 220 + 21 bytes
USER32! 77cf8734()
USER32! 77cf8816()
USER32! 77cfb4c0()
USER32! 77cfdabd()
NTDLL! 7c94eae3()
CFrameWnd::OnClose() line 848
CMainFrame::OnClose() line 457
CWnd::OnWndMsg(unsigned int 0x00000010, unsigned int 0x00000000, long 
0x00000000, long * 0x0012f85c) line 1825
CWnd::WindowProc(unsigned int 0x00000010, unsigned int 0x00000000, long 
0x00000000) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00386f08 {CWnd hWnd=0xdddddddd}, HWND__ * 0x003f08e0, 
unsigned int 0x00000010, unsigned int 0x00000000, long 0x00000000) line 215 + 
26 bytes
AfxWndProc(HWND__ * 0x003f08e0, unsigned int 0x00000010, unsigned int 
0x00000000, long 0x00000000) line 368
AfxWndProcBase(HWND__ * 0x003f08e0, unsigned int 0x00000010, unsigned int 
0x00000000, long 0x00000000) line 220 + 21 bytes
USER32! 77cf8734()
USER32! 77cf8816()
USER32! 77cfb4c0()
USER32! 77cfb50c()
NTDLL! 7c94eae3()
USER32! 77d108be()
USER32! 77d2f680()
CMDIFrameWnd::DefWindowProcA(unsigned int 0x00000112, unsigned int 0x0000f060, 
long 0x00000000) line 198
CWnd::Default() line 249
CWnd::OnSysCommand(unsigned int 0x0000f060, unsigned int 0x0000f060) line 418 + 
15 bytes
CFrameWnd::OnSysCommand(unsigned int 0x0000f060, long 0x00000000) line 1042
CWnd::OnWndMsg(unsigned int 0x00000112, unsigned int 0x0000f060, long 
0x00000000, long * 0x0012fcc4) line 1849
CWnd::WindowProc(unsigned int 0x00000112, unsigned int 0x0000f060, long 
0x00000000) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00386f08 {CWnd hWnd=0xdddddddd}, HWND__ * 0x003f08e0, 
unsigned int 0x00000112, unsigned int 0x0000f060, long 0x00000000) line 215 + 
26 bytes
AfxWndProc(HWND__ * 0x003f08e0, unsigned int 0x00000112, unsigned int 
0x0000f060, long 0x00000000) line 368
AfxWndProcBase(HWND__ * 0x003f08e0, unsigned int 0x00000112, unsigned int 
0x0000f060, long 0x00000000) line 220 + 21 bytes
USER32! 77cf8734()
USER32! 77cf8816()
USER32! 77cf89cd()
USER32! 77cf96c7()
CWinThread::PumpMessage() line 846
CWinThread::Run() line 480 + 11 bytes
CWinApp::Run() line 400
AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 
0x00151f25, int 0x00000001) line 49 + 11 bytes
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00151f25, 
int 0x00000001) line 30
WinMainCRTStartup() line 330 + 54 bytes
KERNEL32! 7c816fd7()

PATIO 2007/01/29(月) 14:57:46
えーと。
既に何処で落ちているかは出ている気がします。

予想通りINT 3が挿入されています。

7c941230 INT 3 ←PC
7c941230 res

NTDLL! 7c941230()
NTDLL! 7c989b79()
NTDLL! 7c9669a9()
NTDLL! 7c9ae062()
NTDLL! 7c98a5d0()
NTDLL! 7c9668ad()
_free_base(void * 0x00386ee8) line 60
_free_dbg_lk(void * 0x00386f08, int 0x00000004) line 1083 + 9 bytes
_free_dbg(void * 0x00386f08, int 0x00000004) line 970 + 13 bytes
CObject::operator delete(void * 0x00386f08) line 46 + 12 bytes
CMainFrame::`scalar deleting destructor'(unsigned int 0x00000001) + 56 bytes

どうやらCMainFrameのデストラクタが動く時にその書き換えられている部分が
動いている模様。

と言うわけで、メモリ破壊しているのはほぼ確実かと。
で、どこで何処を破壊しているかは、地道に探るしかありません。
メッセージはHEAPが変更されていると出ていますが、
これが直接の原因かは変わりません。
どこかのスタック領域が壊された事が原因でそのあおりを食ったとも
考えられますし、基本的に不正アクセスでメモリ破壊している場合、
何が起こってもおかしくないです。

とにかく、一般的な例からメモリ破壊を起こしそうな所を片っ端から当たるか、
バウンダリ チェッカーやピューリファイと言ったチェック用のソフトを 使って
調べるかですね。これらは高価なのでおいそれとは手が出ませんけれど。
あとは、機能単位でコメントアウトしながら問題の箇所を絞り込むとか
地道な方法で探るしか無いと思います。

PATIO 2007/01/29(月) 15:00:03
> 多分、破棄済みのオブジェクトにデストラクタが走ってるとか、そんなところ。

これとっても重要なヒントだと思いますよ。
調べてみる価値はあると思います。

Norikichi 2007/01/29(月) 17:32:02
了解しました。

地道に調べたいと思います。

解決したら報告します。
ありがとうございました。

Ban 2007/01/29(月) 17:48:00
> _free_dbg(void * 0x00386f08, int 0x00000004) line 970 + 13 bytes
> CObject::operator delete(void * 0x00386f08) line 46 + 12 bytes
> CFrameWnd::PostNcDestroy() line 210 + 31 bytes

NcDestroyはWindowの最後のメッセージで、CObjectのdeleteが直接原因のようなので、
このかんじだと"直接的に怪しい"のは、CFrameWndの上にのってる/その子供のウィンドウの
コントロールあたりでしょうか。
# 勿論、"それ以前のところがメモリ破壊した結果、割を食ってるだけ"の可能性はあります。
動的にコントロール作ってるとか、自作のサブクラス化したコントロール使ってるとか、
そんなところがあれば、それも要注意でしょうか。

Norikichi 2007/01/31(水) 10:47:52
[[解決]]
使用PCの引越し等がありVisualStadioV6にSP5をするのを忘れていたの思い出し、SP5をセ
ットアップしました。そうしたら"userBreak...."が出なくなりました。
納得はいきませんが、解決(?)。
確かに使用していた子ウィンドのコントロールを削除し、別のコントロールに置き換えた
りしたのですが、SP5にすると出なくなったので、原因を突き止めることができなくなり
ました。
また再現したら、今度こそ原因をしらべ報告します。
とりあえずの解決(?)ですが、いろいろありがとうございました。

Blue 2007/01/31(水) 10:52:40
>SP5
最新版(最終版?)はSP6ですが、なんでSP5なんですかね?
「SP5で開発する」ってのが決まっているとか?

Visual Studio 6.0 Service Pack 6 
http://www.microsoft.com/japan/msdn/vstudio/downloads/sp/vs6sp6.aspx

Ban 2007/01/31(水) 11:09:36
質問者さんがどうかは不明ですが、より新しい環境の話題にのまれたのか、
結構VC6 SP6の存在を知らない人はいますよね。

んで、VC8(2005)のSP1の陰に隠れて、VC7.1(.NET2003)のSP1も知られてない…。
http://www.microsoft.com/downloads/details.aspx?FamilyId=69D2219F-CE82-46A5-
8AEC-072BD4BB955E&displaylang=ja

VC7.0(.NET 2002)のSP1はもっと知名度がない…(いや、使ってる人もいないのか…?

PATIO 2007/01/31(水) 13:02:31
SP6はこれを使うと不都合が出るので使っていないと言うパターンもあったり。
プロセッサパックを使いたい人はたしかSP6は当てられなかったと思います。
私もその理由でしばらく当てていませんでしたし。

古いスレッドには追加発言できません。