1

C++/CLI アセンブリ (このアセンブリはネイティブ C++ dll のラッパーです) をテストする C# プログラムがありますが、次のエラー メッセージが表示されます。

Unhandled exception at 0x50f8fd85 (msvcr90d.dll) in TestKeyManagerApp.exe: 0xC0000005:     Access violation writing location 0x00000000.

デバッグ モードの最後の位置: dbgheap.c (Visual Studio 2008 出力)

if (pHead == NULL)
{
    *errno_tmp = ENOMEM; <----- ACCESS VIOLATION
    RTCCALLBACK(_RTC_FuncCheckSet_hook,(1));
}

アセンブリ クラスのオブジェクトを 1 回作成し (C# プログラムのプライベート メンバー)、コンストラクターでネイティブ C++ dll をロードします。アセンブリ オブジェクトを 2 回目に使用すると (テスト関数の 2 回目の呼び出し)、このエラー メッセージが表示されます。

コール スタックの出力:

msvcr90d.dll!_heap_alloc_dbg_impl(unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x50ec24a8, int nLine=588, int * errno_tmp=0x00000000)  Line 431 + 0x3 bytes C++

msvcr90d.dll!_nh_malloc_dbg_impl(unsigned int nSize=532, int nhFlag=0, int nBlockUse=2, const char * szFileName=0x50ec24a8, int nLine=588, int * errno_tmp=0x00000000)  Line 239 + 0x19 bytes   C++

msvcr90d.dll!_calloc_dbg_impl(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x50ec24a8, int nLine=588, int * errno_tmp=0x00000000)  Line 593 + 0x20 bytes   C++

msvcr90d.dll!_getptd_noexit()  Line 588 + 0x1a bytes    C

msvcr90d.dll!_errno()  Line 281 + 0x5 bytes C

msvcr90d.dll!_calloc_dbg(unsigned int nNum=1, unsigned int nSize=532, int nBlockUse=2, const char * szFileName=0x50ec20a4, int nLine=373)  Line 646 + 0x11 bytes    C++

msvcr90d.dll!__CRTDLL_INIT(void * hDllHandle=0x50ec0000, unsigned long dwReason=2, void * lpreserved=0x00000000)  Line 373 + 0x18 bytes C

msvcr90d.dll!_CRTDLL_INIT(void * hDllHandle=0x50ec0000, unsigned long dwReason=2, void * lpreserved=0x00000000)  Line 214 + 0x11 bytes  C

ntdll.dll!77c68968()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!77c73820()    
ntdll.dll!77c735bc()    

ヒントやヒントをいただければ幸いです。

どうも!

4

2 に答える 2

1

コールスタック、特に管理されていないものを確認してください。このためには、アンマネージコードデバッグを有効にする必要があります。これはおそらく、偽の削除またはダンギング/無効なポインタアクセスです。ネイティブDLL呼び出しを最小限に抑えて、問題を絞り込みます。

于 2012-07-03T08:06:53.643 に答える
0

エラーの潜在的な理由:

  • ポインタerrno_tmpは、削除されたメモリを指しているか、配列境界の外側を指している可能性があります (-ve インデックスまたはインデックス >= 長さ)。

  • 無効なP\Invokeアセンブリが使用されているか、ロードされたアセンブリがfree

于 2012-07-03T07:53:49.193 に答える