1

デバッグできないアクセス違反が発生しています。

CRT call 内で何らかの再帰エラーが発生しているようです_CrtCheckMemory

以下はコール スタック (下 -> 上) で、...繰り返されるメッセージが削除されています。

msvcr100d.dll!__chkstk()    Unknown
msvcr100d.dll!_VCrtDbgReportA(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 252  C
msvcr100d.dll!_CrtDbgReportV(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 242   C
msvcr100d.dll!_CrtDbgReport(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, ...) Line 258   C
msvcr100d.dll!_CrtCheckMemory() Line 1817   C++
msvcr100d.dll!_heap_alloc_dbg_impl(unsigned __int64 nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 383 C++
msvcr100d.dll!_nh_malloc_dbg_impl(unsigned __int64 nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239  C++
msvcr100d.dll!_calloc_dbg_impl(unsigned __int64 nNum, unsigned __int64 nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 601  C++
msvcr100d.dll!_getptd_noexit() Line 470 C
msvcr100d.dll!_XcptFilter(unsigned long xcptnum, _EXCEPTION_POINTERS * pxcptinfoptrs) Line 202  C
msvcr100d.dll!_callthreadstartex$filt$0() Line 316  C
msvcr100d.dll!__C_specific_handler(_EXCEPTION_RECORD * ExceptionRecord, void * EstablisherFrame, _CONTEXT * ContextRecord, _DISPATCHER_CONTEXT * DispatcherContext) C
ntdll.dll!0000000077989d0d()    Unknown
ntdll.dll!00000000779791af()    Unknown
ntdll.dll!00000000779b1278()    Unknown
msvcr100d.dll!__chkstk()    Unknown
...
msvcr100d.dll!_VCrtDbgReportA(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 298  C
msvcr100d.dll!_CrtDbgReportV(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 242   C
msvcr100d.dll!_CrtDbgReport(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, ...) Line 258   C
msvcr100d.dll!_CrtCheckMemory() Line 1817   C++
msvcr100d.dll!_heap_alloc_dbg_impl(unsigned __int64 nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 383 C++
msvcr100d.dll!_nh_malloc_dbg_impl(unsigned __int64 nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239  C++
msvcr100d.dll!_calloc_dbg_impl(unsigned __int64 nNum, unsigned __int64 nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 601  C++
msvcr100d.dll!_getptd_noexit() Line 470 C
msvcr100d.dll!_errno() Line 280 C
msvcr100d.dll!_VCrtDbgReportA(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 298  C
msvcr100d.dll!_CrtDbgReportV(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, char * arglist) Line 242   C
msvcr100d.dll!_CrtDbgReport(int nRptType, const char * szFile, int nLine, const char * szModule, const char * szFormat, ...) Line 258   C
msvcr100d.dll!_CrtCheckMemory() Line 1817   C++
msvcr100d.dll!_free_dbg_nolock(void * pUserData, int nBlockUse) Line 1288   C++
msvcr100d.dll!_free_dbg(void * pUserData, int nBlockUse) Line 1265  C++
msvcr100d.dll!_freefls(void * data) Line 622    C
msvcr100d.dll!_freeptd(_tiddata * ptd) Line 683 C
msvcr100d.dll!_endthreadex(unsigned int retcode) Line 365   C
msvcr100d.dll!_callthreadstartex() Line 315 C
msvcr100d.dll!_threadstartex(void * ptd) Line 297   C
kernel32.dll!000000007729652d() Unknown
ntdll.dll!000000007798c521()    Unknown

これを引き起こしている原因や、デバッグ方法についてのアドバイスはありますか?

4

2 に答える 2

4

まあ、それは少し悲劇的です。ヒープが破損していることを知らせる診断を生成しようとしています。レポート コードは、表示するためにerrnoの値を取得しようとしますが、これは必要に応じて割り当てられる静的 CRT 変数です。したがって、メモリを割り当てます。どちらが死ぬか、ヒープが壊れています。これにより、ヒープが破損していることを示す診断がトリガーされます。残りは推測できますが、これはスタックがなくなるまで続きます。

1 つの回避策は、次のコードをメイン (またはスレッド) の先頭に追加することです。

 int dummy = errno;

そのため、CRT はヒープが破損する前にメモリを割り当てます。破損の原因を見つける必要があります。

于 2012-10-02T19:08:53.430 に答える
2

実際、あなたの主な問題は、メモリが破損していることです。プログラムを終了したいときに、内部に割り当てられたメモリ(スレッドごとのデータを保存するために使用されていたメモリ)を解放したいのですが、デバッグバージョンを使用しているため、メモリをチェックし、失敗を理解し、アサーション ウィンドウの表示を開始します。アサーション ウィンドウを表示する場合は、メモリを割り当て、メモリ割り当てルーチン (この場合mallocは witch に変換されますmalloc_dbg) を使用して、必要なメモリを割り当て、malloc_dbgメモリの状態を確認し、メモリの破損を理解してから、再度アサーション ウィンドウを表示してみてください。この手順が繰り返されます。動的メモリ割り当てを確認してください(さらに静的に定義された配列をオーバーライドして確認してください)、メモリの破損を解決してください。スタックオーバーフローは自動的に解決されます

于 2012-10-02T18:50:53.433 に答える